2017-09-06 64 views
-1

下面的for循環會一直持續到字符串結束,而if分支會檢查字符'u'出現在字符串「yuzuf Oztuk」中的次數,這是3次。同時,變量計數字符串中u的個數。當我編譯代碼時,我得到了15次你出現在字符串中的次數,這是錯誤的。計算一個字符在c編程中出現在字符串中的次數?

int numTimesAppears(char* mystring, char ch) 
{ 
    int i; 
    int count; 
    for(i = 0; mystring[i] != '\0' ; ++i) 
    { 
     if (mystring[i] == ch) 
     { 
      count++; 
     } 
    } 
    return count; 
} 
+7

'詮釋計數;' - >'詮釋計數= 0;' – BLUEPIXY

+0

謝謝你,我剛剛編譯它,它給了我正確的答案。 – user24741

+2

使用未初始化的變量是未定義的行爲 – yano

回答

1

我得到15出現u字符串,這是錯誤的次數。

  1. 關鍵問題:代碼需要初始化的count值。 @BLUEPIXY

    // int count; 
    int count = 0; 
    
  2. 角情況下:作爲空字符是字符串中,1的結果「爲次數的字符出現在字符串」所預期的任何numTimesAppears(some_string, '\0')。 A do循環修復了這一問題。一個類似的標準庫函數是strchr(),它尋找第一個匹配並考慮空字符部分可搜索字符串:「...終止空字符被認爲是字符串的一部分。」與所有的角落案例一樣,可以推斷出各種結果 - 最好是在這種情況下記錄編碼目標。

    i = 0; 
    do { 
        if (mystring[i] == ch) { 
        count++; 
        } 
    } while (mystring[i++]); 
    
  3. 由於功能不修改字符串檢查,使其const增加了功能的實用性,也許性能。 @Vlad from Moscow

  4. 數組索引最好用size_t而不是intint可能太窄。

    size_t numTimesAppears(const char* mystring, char ch) { 
        size_t count = 0; 
        size_t i = 0; 
        do { 
        if (mystring[i] == ch) { 
         count++; 
        } 
        } while (mystring[i++]); 
        return count; 
    } 
    
+1

2是錯誤的。一個字符串不包含NUL字符。 NUL用於實現C字符串的事實並不意味着它包含NUL。如果有助於思考這個問題,字符串包含的字符數由'strlen()'給出,'strlen()'不包含NUL的數量。 'numTimesAppears(anyString,'\ 0')'應該總是返回'0'。 –

+0

@KevinBallard有關[「字符串不包含」NUL字符「](https://stackoverflow.com/questions/46085187/counting-the-number-of-times-a-character-appears-in-a -string-in-c-programming/46085480?noredirect = 1#comment79133256_46085480),C規範將_string_定義爲「一個_string_是一個連續的字符序列,並以**結尾,包括第一個空字符**。也許C規範是錯誤的?許多標準的lib函數顯然不計數_null字符_,而其他字符顯式地執行。 IAC,我認爲我們同意這個功能應該記錄在這個案例中。 – chux

+0

4.有點冒險。它的寬度是實現定義的(6.5.3.4),不建議轉換等級大於* signed long int *(7.1.9),並且只能保證大於「65535」(7.20。3) - 儘管我見過的任何編譯器都至少提供了一個範圍,它覆蓋了'int'的正值,而Gnu確實提供了一個範圍,超過了'long int'的正值。所以這是實現定義湯的另一個美妙的地方...... –

相關問題