2016-03-07 55 views
0

給定此字符串「紅色,藍色,綠色」創建一個包含這些顏色作爲其元素的數組。我在下面寫的代碼可行,但是當我將顏色的第一個字母改爲大寫時,我會得到輸出 - 紅色,藍色\ 301-!Wree \ 316。我怎樣才能讓這段代碼更具動態性,能夠處理以大寫字母開頭的單詞呢?謝謝。C字符串到數組 - 字符串錯誤

#include <stdio.h> 
#include <stdlib.h> 


int findLength(char string[]){ 
    int l =0; 

    for(l = 0; string[l]!='\0'; l++){ 

    } 
    return l; 
}; 


char *stringToArray(char string[]){ 
    int i = 0; 
    int j = 0; 
    char c = ','; 
    int n = 0; 
    int l = findLength(string); 

    char *str = (char *)malloc(l * sizeof(char)); 

    while(string[i] != l){ 
     if(string[i] == c || string[i] != '\0'){ 
      for(n = j; n < i; n++){ 
       str[j++] += string[n]; 
      } 

     } 
     i++; 

    } 
    printf("%s\n", str); 
    str = '\0'; 
    return str; 
} 


int main(int argc, const char * argv[]) { 
    char *string = "red, blue, green"; 
    //char *string = "Red, Blue, Green"; 
    char *str = stringToArray(string); 
    free(str); 

    return 0; 

} 
+0

你的程序實際上應該做什麼?它似乎只是複製一個字符串。它應該改變或解析它以某種方式?另外,你已經重新創建了'strlen()'函數。不知道你爲什麼這樣做。最後,你是'malloc()'單個字節的內存。你很幸運'j'沒有被增加,否則你的程序會出現分段/崩潰。 – DevNull

+0

我正在學習數組和字符串,我不允許使用strlen()或string.h中的任何字符串操作函數。我寫這段代碼的確切問題是 - 給這個字符串:「紅色,藍色,綠色」 - 創建一個包含這些國家作爲其元素的數組。注意:逗號是分隔符。代碼有效,但是當我改變每種顏色以大寫字母開頭時,它不再起作用。 @Dogbert –

+0

我剛剛檢查了你的代碼,你到底想做什麼? –

回答

0

奇怪的行爲與您的字符串是否有upparcase字母沒有任何關係。在stringToArray循環您的終止條件是錯誤的:

int l = findLength(string); 

    while (string[i] != l) ... 

條件應該是

while (i < l) ... 

,或者因爲你已經在findLength使用:

while (string[i] != '\0') ... 

因爲條件錯誤– l在你的情況下是16,並且沒有一個字母的ASCII值爲16 –你超越了字符串的有效範圍,這導致了未定義的行爲。

現在,您只需將舊字符串複製到新字符串,儘管以非常奇怪的方式。你的內部循環使用三個變量,其中它增加了兩個變量。這很混亂。它可能也不會做你的想法,因爲條件:

if (string[i] == c || string[i] != '\0') .. 

是字符串的所有字母爲真,前提是opuer循環應考慮有效字符最多,但不包括結束字符串。

最後,如果你要複製的字符串,你應該終止字符分配süpace:

char *str = malloc(l + 1); 

如果要追加最終空字符:

str = '\0'; 

你實際設置while分配的字符串爲null,這導致內存泄漏。 (在mainfree不會產生一個錯誤,因爲free可以依法採取'NULL`作爲參數。)相反,使用:

str[l] = '\0'; 

有了這些修補程序,你現在有一個程序,複製原始的字符串。 (POSIX)庫函數strdup可以更有效地執行此操作。如果你想返回一個字符串數組,你必須反映你的函數返回一個指向字符指針的指針。

下面是該行爲的可能實施。 (它使用爲堆上的一切分配內存的辦法。如果你總是希望三個短字符串,可能不是最好的解決方案。)

#include <stdio.h> 
    #include <stdlib.h> 
    #include <string.h> 

    char **stringToArray(const char *str) 
    { 
     char **res; 
     const char *p = str; 
     int n = 0; 

     while (p) { 
      p = strchr(p, ','); 
      if (p) p++; 
      n++; 
     } 

     res = malloc((n + 1) * sizeof(*res)); 

     p = str; 
     n = 0; 
     while (p) { 
      const char *begin; 
      size_t len; 

      while (*p == ' ') p++; 
      begin = p; 

      p = strchr(p, ','); 
      if (p) { 
       len = p - begin; 
       p++; 
      } else { 
       len = strlen(begin); 
      } 

      res[n] = malloc(len + 1); 
      memcpy(res[n], begin, len); 
      res[n][len] = '\0'; 

      n++; 
     } 

     res[n] = NULL; 
     return res; 
    } 


    int main(int argc, const char * argv[]) 
    { 
     char *str = "Vermilion, Ultramarine, Chartreuse"; 
     char **res = stringToArray(str); 
     int i = 0; 

     for (i = 0; res[i]; i++) { 
      puts(res[i]); 
      free(res[i]); 
     } 
     free(res); 

     return 0; 
    } 
+0

謝謝@M Oehm –

0

你有一些錯誤...... 我已經糾正他們爲你:

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 


int findLength(char string[]){ 
    int l = 1; 

    for (int i = 0; string[i] != '\0'; i++){ 
     if (string[i] == ',')// to check the end of a color 
      l++; 
    } 
    return l; 
}; 


char **stringToArray(char string[]){//added a * for array of satrings 
    int i = 0; 
    int j = 0; 
    char c = ','; 
    int n = 0; 
    int l = findLength(string); 

    char **str = (char **)malloc(l * sizeof(char*)+l); 
    char *pos = string; 
    for (int i = 0; i < l-1; i++) //getting each color to the array 
    { 
     char *c =strchr(string, ','); 
     int index = c - pos; 
     string[index] = 0; 
     str[i] = _strdup(pos); //copying the color to the array 
     pos = c + 1; 
     string = string +1 +index; // next color 
    } 
    str[l - 1] = _strdup(pos); //copying last color 

    for (int i = 0; i < l; i++) //printing the results 
    { 
     printf("%s\n",str[i]); 
    } 

    return str; 
} 


int main(int argc, const char * argv[]) { 
    char string[] = "red,blue,green"; //deleted spaces 
    char **str = stringToArray(string); 
    getchar(); 
    free(str); 

    return 0; 

} 

還增加了您的理解意見。

+0

謝謝,非常有幫助 –