从函数返回无空格字符串

时间:2014-03-08 10:32:51

标签: c arrays space

我有一个功能,其中我想返回一个字符串(即字符数组),根本没有空格。这是我的代码,在我的理解中是不对的:

char *ignoreSpace( char helpArr[], int length ){
    int i = 0; int j = 0;
    char withoutSpace[length];
    while ( i < length ){
        /*if not a space*/
        if ( isspace( helpArr[i] ) == FALSE )
            withoutSpace[j] = helpArr[i];
        i++;
    }
    return *withoutSpace;
}

我的意图是:

return *withoutSpace;

是否返回数组的内容而没有空间,所以我可以解析一个完全没有空格的字符串。

请告诉我如何才能让它变得更好?

4 个答案:

答案 0 :(得分:1)

当函数返回时,您当前的解决方案将丢失withoutSpace的结果,因为它仅在该函数的范围内定义。

一个更好的模式是接受函数的第三个参数,它是一个指向char[]的指针,用于将结果写入 - 与标准函数的方式非常相似,(例如strcpy

char* ignoreSpace(char* src, char* dst, int length) {
    // copy from src to dst, ignoring spaces
    // ...
    // ...
    return dst;
}

答案 1 :(得分:0)

您永远不会增加j。如果源字符串的当前字符不是空格,您可能希望将其存储在输出字符串中,然后将j增加一个;这样你就可以将下一个可能的角色存储到下一个插槽中,而不是一次又一次地覆盖0个角色。

所以改变这个:

...
    withoutSpace[j] = helpArr[i];
...

进入这个:

...
    withoutSpace[j++] = helpArr[i];
...

然后还附加withoutSpace 0'\0'(它们是相同的),以便任何字符串处理函数都知道它的结束。还要返回指针,因为你应该这样做,而不是*withoutSpacewithoutSpace[0](它们是相同的):

char *ignoreSpace( char helpArr[], int length ){
    int i = 0; int j = 0;
    char * withoutSpace = malloc( length * sizeof * withoutSpace ); // <-- changed this
    while ( i < length ){
        /*if not a space*/
        if ( isspace( helpArr[i] ) == FALSE )
            withoutSpace[j++] = helpArr[i]; // <-- replaced j with j++
        i++;
    }
    withoutSpace[j] = 0;    // <-- added this
    return withoutSpace;
}

然后你应该好好去,假设你可以拥有可变长度数组。

编辑:那么,可变长度数组与否,您最好使用malloccalloc或其他东西来使用动态内存分配,因为否则,根据评论,你将返回一个本地指针变量。当然,这需要您最终手动free分配的内存。

答案 2 :(得分:0)

试试这个(假设以空字符结尾的字符串)

void ignoreSpace(char *str) {
   int write_pos = 0, read_pos  = 0;
   for (; str[read_pos]; ++read_pos) {
      if (!isspace(str[read_pos]) {
         str[write_pos++] = str[read_pos];
      }
   }
   str[write_pos] = 0;
}

答案 3 :(得分:0)

您无法从函数返回指向局部变量的指针,因为只要您离开该函数,所有局部变量都将被销毁并且不再有效。

你必须

  1. 在函数中使用malloc分配空格并返回指针 到那个分配的记忆

  2. 不从函数返回指针而是直接修改 原始字符串。

  3. 第一个解决方案:

    char *ignoreSpace(char helpArr[], int length)
    {
      int i=0; int j=0;
      char *withoutSpace = malloc(length) ;
    
      while(i <= length)
      {
        /*if not a space*/
        if(isspace(helpArr[i]) == FALSE)
            withoutSpace[j++] = helpArr[i];
    
        i++;
      }
    
      return withoutSpace;
    }
    

    第二个解决方案:

    char *ignoreSpace(char helpArr[], int length)
    {
      int i=0; int j=0;
    
      while(i <= length)
      {
        /*if not a space*/
        if(isspace(helpArr[i]) == FALSE)
            helpArr[j++] = helpArr[i];
    
        i++;
      }
    
      return helpArr;
    }
    

    我的代码中还有一些其他的小修正。找出哪些是留给读者的练习。