c++
  • c
  • 2015-10-27 23 views 0 likes 
    0

    下面是函數的代碼:如何標記C字符串的結尾?

    void pattern(char word[200], char asPattern[200]) { 
        for (unsigned i = 0; i < strlen(word); i++) { // unsigned to remove warning 
         if (strchr("aeiou", word[i]) != 0) asPattern[i] = '*'; 
         else asPattern[i] = '#'; 
    } 
    

    基本上這個函數替換詞用#和元音帶*號的輔音,並存儲在asPattern串的新格局。但是,如果我在屏幕上顯示asPattern,它顯示正確的模式後面跟着一堆未知符號(strlen(asPattern)等於211或for循環之後的東西)。 我相信問題是asPattern的到底是不是標和 asPattern [strlen的(asPattern)] =「/ 0」 不工作,我不知道還能做什麼?

    我不能使用std :: string,所以請忍受我並使用C字符串。

    +6

    它是反斜槓而不是斜線。 –

    +1

    你沒有提到你是否可以使用算法功能。他們也使用char數組,而不僅僅是'std :: string'。 – PaulMcKenzie

    +0

    我建議刪除C++標籤,因爲這個問題與C++無關。 –

    回答

    6

    之前添加代碼

    asPattern[strlen(word)] = '\0'; 
    

    任一個或之後的for循環

    +2

    一般來說,我會建議使用'asPattern [strlen(asPattern)]'。也就是說,你在'asPattern'的末尾設置了NUL字符,所以在'asPattern'上使用'strlen()',而不是'word'。我知道它們的長度應該是相同的,但有時代碼並沒有達到你期望的值(想想更復雜的函數),在這種情況下,最好有一個更安全的方法。出於同樣的原因,我會把這行*放在for循環之後,當替換結束時。然後你就不會處理你期望的*:你在處理你*擁有的*。 –

    +0

    它工作!謝謝 ! –

    +6

    @FabioTurati'strlen'如何在尚未終止的字符串上工作? –

    2

    C-字符串由空字符,其可以通過文字0或 '\ 0' 來表示終止。與C字符串一起工作的函數(如strlen)期望這樣做。注意空字符strlen()掃描字符串,所以你的循環:

    for (unsigned i = 0; i < strlen(word); i++) 
    

    是無效的 - strlen()必須掃描word在每個迭代上。所以,更好的代碼可能是:

    void pattern(char word[200], char asPattern[200]) { 
        const unsigned len = strlen(word); 
        for (unsigned i = 0; i < len; i++) { // unsigned to remove warning 
         if (strchr("aeiou", word[i]) != 0) asPattern[i] = '*'; 
         else asPattern[i] = '#'; 
        } 
        asPattern[len] = 0; // or '\0' if you prefer 
    } 
    
    +0

    不妨使用'len = strlen(word)'來防止調用'strlen()'的次數與OP代碼中的次數相同。 – chux

    +0

    建議調用''\ 0'' _null character_而不是_ NULL字符作爲'NULL'最好爲_null指針constant_保留。 – chux

    +0

    @chux空指針常量是'nullptr',但我同意:) – Slava

    0

    我已經測試你的函數,它工作正常。 (這裏是片段:http://rextester.com/XDSU30889

    的「asPattern」必須被髮送到任何內容清除功能(它必須是充滿'\0' -s,這就是GlobalAlloc()做什麼,如果你使用的是Windows,否則使用malloc()然後memset()

    2

    最簡單,幾乎萬無一失的解決方案僅僅是人物的整個塊設置爲\0,這工作正常,假設你有字符數組的實際大小的先驗知識。

    #include <string.h> 
    void pattern(char word[200], char asPattern[200]) 
    { 
        memset(asPattern, '\0', 200); // we are assuming that there really are 200 bytes 
        //... 
    } 
    

    一旦你做到了這一點,那麼你不必擔心空終止符。

    此外,請注意這一點:

    void pattern(char word[200], char asPattern[200]) 
    

    沒有比這不同:

    void pattern(char* word, char* asPattern) 
    

    因此,實際上,該功能並不知道asPattern有多大。因此,如果您知道前面的尺寸是什麼,並且您知道您將覆蓋字符串,只需使用memset,並忘記了您是否應該使用strlen()或其他可能的方案來了解哪裏空字節將進行。

    相關問題