2012-02-24 84 views
0

我使用fgets输入字符串,例如: “你好,世界”。我想尝试删除这个词之间的空格,但是我正在尝试不断返回hello @ world(其中@是一个随机字符)。C - 删除字符串中的空白字符

void sortString(char phrase[]) 
{ 
    int i, j; 
    char temp[200]; 


    for(i = 0; i < 200; i++) 
    { 
     if(!(isspace(phrase[i]))) 
     { 
      temp[i] = phrase[i]; 
     } 
    } 

    printf("%s", temp); 
} 

所以我基本上是从短语到一个临时数组复制的字符[I]过,如果它不是一个空白,但我不能确定,为什么我得到一个随机字符,而不是只是,例如,helloworld。

+1

你在那里获得随机字符,因为你没有指定你想要那里。 – Eimantas 2012-02-24 15:29:25

回答

5

每当你在phrase看到一个空白字符,你只是跳过同等位置temp,离开它未初始化(含垃圾)。您需要一个单独的计数器来跟踪temp阵列中的当前位置。

此外,您应该检查phrase中以\0字符结尾的字符串,而不是盲目复制所有200个字符,并确保temp字符串也安全地终止。

确保temp[]实际上足够大,以便将结果输出留作进一步练习。 (看看Gandaro的答案的线索。)

void sortString(char phrase[]) 
{ 
    int i, j; 
    char temp[200]; 

    for(i = 0, j = 0; phrase[i] != '\0'; i++) 
    { 
     if(!(isspace(phrase[i]))) 
     { 
      temp[j++] = phrase[i]; 
     } 
    } 

    temp[j] = '\0'; 
    printf("%s", temp); 
} 
3

至少有3个问题:

  • 确定源字符串将永远是200个字符长?你不应该检查\0吗?

  • 您需要为temp使用单独的索引。现在,当您跳过字符时,您会在temp中留下未初始化的“漏洞”。

  • 您需要零终止temp

0

即使你跳过temp[i]=phrase[i],你每次循环增加温度中的位置。您需要一个变量来跟踪独立于i的临时位置。

1

因为您没有为空格所在位置的字符串赋值。

的工作准则是:

void sortString(char phrase[]) 
{ 
    int i = 0, j; 
    char *temp = malloc(strlen(phrase) + 1); 

    if (temp == NULL) 
    { 
     perror("A fatal error occured...\n"); 
     return; 
    } 

    for (j = 0; phrase[j]; j++) 
    { 
     if(!(isspace(phrase[j]))) 
     { 
      temp[i++] = phrase[j]; 
     } 
    } 

    temp[i] = 0; 

    printf("%s", temp); 
    free(temp); 
} 
+0

如果词组中有超过200个非空格字符,则失败。 – swestrup 2012-02-24 15:44:51

+0

不是在我编辑之后。 :P – Gandaro 2012-02-24 15:46:04

+0

当然,但现在你有内存泄漏。 :-P – swestrup 2012-02-25 16:05:11