簡體   English   中英

使用指向 arrays 的指針比較字符串中的字符

[英]Comparing characters in strings using pointers to arrays

我正在完成一項任務以完成 function bool isEven(char* s, char* v) function 的目的是計算字符串(用s表示)中指定的某些字母(用v表示)的出現次數。 sv是指向持有字符的 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將顯示4Even ,如果在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中的字符進行匯總,並將這些字符的出現次數相加。

該方案只需要在sv上 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM