![](/img/trans.png)
[英]Using arrays of character strings: arrays of pointers - Are they like multidimensional arrays?
[英]Comparing characters in strings using pointers to arrays
我正在完成一項任務以完成 function bool isEven(char* s, char* v)
。 function 的目的是計算字符串(用s
表示)中指定的某些字母(用v
表示)的出現次數。 s
和v
是指向持有字符的 arrays 的指針。
如果在s
中找到的來自v
的字母的實例數是偶數,則 function 返回true
。 例如,給定字符串"once upon a time"
和要計算的字母字符串,如元音"aeiou"
,它會返回false
,因為有 7 個元音(元音只是一個例子,它可以是任何隨機字符串字母)。
我有一個變量count
來計算v
中的任何字母出現在s
中的實例。 當我運行我的程序時,我的計數總是返回為0
。 我究竟做錯了什么? 誰能告訴我如何更正我的代碼來解決這個問題?
我也嘗試使用嵌套的while
循環並得到相同的結果。
bool isEven(char* s, char* v) {
int count = 0;
// iterate through de-referenced strings
for (int i = 0; *(s+i) != '\0'; i++) {
for (int j = 0; *(v+j) != '\0'; j++) {
if (*(s+i) == *(v+j)) {
count++;
}
}
}
// check count output
std::cout << count;
if (count % 2 == 0) {
return true;
}
else {
return false;
}
}
以下代碼對我有用,可能對你有用:
#include <iostream>
bool isEven(char[], char[]);
int main(void)
{
bool flag = isEven("Hello Worldo", "aeiou");
if (flag)
std::cout << "Even" << std::endl;
else
std::cout << "Not even." << std::endl;
}
bool isEven(char toCheck[], char from[])
{
int count = 0;
for (int i = 0; toCheck[i] != '\0'; i++)
{
for (int j = 0; from[j] != '\0'; j++)
{
if (toCheck[i] == from[j])
{
count++;
}
}
}
std::cout << count << std::endl;
return (count % 2 == 0) ? true : false;
}
Output
4
Even
字符數組的字符串Hello Worldo
將顯示4
和Even
,如果在toCheck
中找到元音或from
的任何輸入字符,它將計算並確定它是否可以被 2 整除。如果不是,則返回 false(不是偶數),否則為真(偶數)。
一旦我在我的 for 循環中修復了,=,這是我的編譯器的問題,而不是代碼的問題。 所以這里和上面的代碼是正確的。 感謝所有花時間嘗試提供幫助的人!
bool isEven(char* s, char* v) {
int count = 0;
// iterate through de-referenced strings
for (int i = 0; *(s+i) != '\0'; i++) {
for (int j = 0; *(v+j) != '\0'; j++) {
if (*(s+i) == *(v+j)) {
count++;
}
}
}
//check count
std::cout << count << '\n';
if (count % 2 == 0) {
return true;
}
else {
return false;
}
}
該程序可以正常工作,只需對類型進行一些小的修改以避免出現警告。
PS:我嘗試使用最新的 gcc(9.3),下面是現場示例的鏈接: https://gcc.godbolt.org/z/WWHecV
兩級循環是 O(M*N) 解。 由於最多只有 256 個可能的字符,通常最優化的方法是使用 256 個整數的數組來計算每個字符的出現次數,然后 go 對v
中的字符進行匯總,並將這些字符的出現次數相加。
該方案只需要在s
和v
上 go 一次,復雜度為 O(M+N)。 當輸入s
非常大時(例如,哈利波特書籍),性能差異是顯着的。
bool isEven(char* s, char* v) {
int counts[256]; // counter for each possible letters.
for (int i = 0; i < 256; ++i) counts[i] = 0;
char* p = s;
while (*p) ++counts[static_cast<uint8_t>(*p++)]; // count occurrence of each letter.
p = v;
int count = 0;
while (*p) count += counts[static_cast<uint8_t>(*p++)]; // accumulate total occurrence
return (count % 2 == 0);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.