2017-08-25 65 views
-1

我在學C,我有問題。在這個練習中,我必須編寫一個叫做雙荷蘭語的遊戲,在那裏你學會用字符串練習。我遇到的問題是,由於for循環條件(在第一個循環中)程序停止執行。當我打印字符串的長度時,strlen()函數在main和ayInFrontOfConsonant函數中工作良好,但我不明白程序停止工作的原因。在Xcode中,我得到以下消息:線程1:EXC_BAD_ACCESS。很感謝任何形式的幫助。爲什麼strlen函數在這個循環條件下不起作用?

void ayInFrontOfConsonant(char *str) 
{ 
    char consonants[42] = { 'b', 'c', 'd', 'f', 'g', 'h', 'j', 'k', 
'l', 'm', 'n', 'p', 'q', 'r', 's', 't', 'v', 'w', 'x', 'y', 'z', 'B', 
'C', 'D', 'F', 'G', 'H', 'J', 'K', 'L', 'M', 'N', 'P', 'Q', 'R', 'S', 
'T', 'V', 'W', 'X', 'Y', 'Z'}; 


    int a=(int)strlen(str); 

    printf("\n Length of str in ay function: %d\n",a); 

    int i=0,j=0; 
    for(i=0;i<strlen(str);i++)  //problem is here 
    { 
     for(j=0;j<strlen(consonants);j++) 
     { 
      if(str[i]==consonants[j]) 
      { 
       //insertChar(str, 'a', i); 

      } 
     } 
    } 
} 

int main() 
{ 
    int a=0; 
    printf("** Welcome to the Double Dutch game **\n"); 
    char myString[36]; 
    printf("Please enter a string: "); 
    scanf("%[^\n]s", myString); 

    a=strlen(myString); 
    printf("Length of string in main: %d\n",a); 

    ayInFrontOfConsonant(myString); 


    printf("Double dutch traslation: %s\n",myString); 


    return 0; 

}

+0

你的意見是什麼? –

+0

我使用的輸入是:「我喜歡寫C代碼」 –

+0

如果你知道'strlen()'做了什麼,那麼你就不會那樣使用它。 –

回答

3

你的數組有沒有null終止。

取而代之的是,使用sizeof consonants/sizeof *consonants —或在這個特殊的情況下,由於sizeof *consonants肯定是1,然後就sizeof consonants

你不應該在一個for循環的條件下使用strlen(),因爲它每一次遍歷字符串,直到找到null終止這是在缺少你

char consonants[42] = { 'b', 'c', 'd', 'f', 'g', 'h', 'j', 'k', 
    'l', 'm', 'n', 'p', 'q', 'r', 's', 't', 'v', 'w', 'x', 'y', 'z', 'B', 
    'C', 'D', 'F', 'G', 'H', 'J', 'K', 'L', 'M', 'N', 'P', 'Q', 'R', 'S', 
    'T', 'V', 'W', 'X', 'Y', 'Z'}; 

如果使用

const char *consonant = "bcdf ..."; 

相反,編譯器會添加終止符'\0',您也可以明確地添加它

char consonants[] = { 'b', 'c', 'd', 'f', 'g', 'h', 'j', 'k', 
     'l', 'm', 'n', 'p', 'q', 'r', 's', 't', 'v', 'w', 'x', 'y', 'z', 'B', 
     'C', 'D', 'F', 'G', 'H', 'J', 'K', 'L', 'M', 'N', 'P', 'Q', 'R', 'S', 
     'T', 'V', 'W', 'X', 'Y', 'Z', '\0'}; 

一個程序員可能會寫這篇文章,而不是,

#include <stdlib.h> 

void ayInFrontOfConsonant(char *str) 
{ 
    char consonants[] = { 
     'b', 'c', 'd', 'f', 'g', 'h', 'j', 'k', 'l', 'm', 'n', 
     'p', 'q', 'r', 's', 't', 'v', 'w', 'x', 'y', 'z', 'B', 
     'C', 'D', 'F', 'G', 'H', 'J', 'K', 'L', 'M', 'N', 'P', 
     'Q', 'R', 'S', 'T', 'V', 'W', 'X', 'Y', 'Z' 
    }; 

    for (size_t i = 0; str[i] != '\0'; i++) { 
     for (size_t j = 0; j < sizeof consonants; ++j) { 
      if (str[i] == consonants[j]) { 
       // Do here whatever you wanted to do 
      } 
     } 
    } 
} 

但不是真的,因爲不需要掃描輔音全陣列,因爲它們可以進行排序,你可以使用二進制搜索這會改善算法很多。

+0

請注意,'sizeof(constonants)/ sizeof(* constonant)'技術只適用於constonants是數組的情況。將它作爲參數傳遞給一個函數,它將被轉換爲一個指針,並且該技術將不起作用(因此需要以不同的方式傳遞長度)。 – Peter

2

當你寫如下語句char consonants [42] = { ... },三種情況之一發生:

如果你有43個或更多字符,編譯器給你一個錯誤。

如果你有41個或更少的字符,編譯器用零填充數組的其餘部分,strlen()將工作,因爲字符後面有一個空字節。

如果您只有42個字符,編譯器會將數組完全填充到最後。沒有結尾的零字節。 strlen將不起作用。

在現實中,你沒有理由數字。

char consonants [] = "bcdfgh..." 

會做你想要的。

+0

「*會做你想要的東西*」,更好的解決方案實際上是保持數組,但使用'sizeof'而不是'strlen'。 – ikegami

相關問題