2016-03-07 80 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

谢谢,非常有帮助 –