2015-11-28 70 views
0

我不確定如果我只是非常愚蠢的,但我已經使這個函數應該從一個數組中的字符,並選擇性地把他們在另一個去除空間和標點符號。但是,返回似乎只是第一個字符(來自printf)。C:功能沒有返回完整的字符串

char * getWord(char *array) { 
    char *temp = malloc(sizeof(char) * 20); 
    int i= 0; 
    while(i < 20) { 
     if(validChar(array[i])) { 
      printf("pass 1 - %c\n", array[i]); 
      temp[i] = array[i]; 
      printf("pass 2 - %c\n", temp[i]); 
      i=i+1; 
     } 
     else { 
      i=i+1; 
     } 
    } 
    printf("%s\n", temp); 
    return temp; 
} 

的validChar功能:

bool validChar(char given) { 
    char a[]=". ,;:*!?'-\n\r"; 
    for(int q = 0; q <=12; q++) { 
     if(given == a[q]){ 
      return false; 
     } 
    } 
    return true; 
} 

在每個 「通2」 時,正確的打印示出這樣的循環正在按預期。我真的不明白的是,當我刪除條件來選擇有效的字符時,最終的打印語句按預期工作並打印整個字符串。

+0

沒有'validChar'中的for循環只運行到11? –

+0

「但是,返回的結果似乎只是第一個字符(來自printf)。」 - 真的嗎?顯示重現此行爲的代碼。 –

回答

1

首先,你在getWord中對兩個字符串只使用一個計數器。您必須將temp字符串的字符串i的字符串讀數與另一個計數器j分開。 j只會在您實際添加一些字符到temp時增加。

最後,您在之前的printf之前錯過了temp的結尾'\0'

1

對於每個陣列,您需要兩個計數器。計數器i,你已經用於array,和一個新的j將用於臨時。

if(validChar(array[i])) { 
     printf("pass 1 - %c\n", array[i]); 
     temp[j] = array[i]; 
     printf("pass 2 - %c\n", temp[j]); 
     i=i+1; 
     j=j+1; 
    } 
    else { 
     i=i+1; 
    } 

你只打印第一個字符的原因是你從malloc中獲得的內存碰巧包含設置爲零的字節。在temp中跳過的第一個字符包含一個零字節,因爲字符串是零終止的,這就是您打印出的全部字符。

從技術上講,這些零字節未初始化,因此您的代碼的行爲是不確定的。

複製完成後,代碼也不會終止字符串temp。在while循環之後將'\0'的作業添加到temp的位置j,並將while循環條件從20更改爲19(或再分配一個字節),因此零終止符不會被寫入越界。

+1

哇,你是對的! :) –