C-从函数返回一个无空间字符串



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

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;

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

您能告诉我如何使它变得更好吗?

当功能返回时,您的当前解决方案将失去withoutSpace的结果,因为仅在该函数的范围中定义了该函数。

更好的模式是接受该函数的第三个参数,该函数是指向char[]的指针,以将结果写入 - 以标准函数的方式几乎相同(例如strcpy

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

尝试此(假设NULL终止字符串)

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;
}

您无法将指针从函数返回到局部变量,因为一旦离开函数,所有局部变量都被拆下了并且不再有效。

您必须

  1. 在您的功能中将空间分配给malloc并返回指针分配的内存

  2. 不要从函数返回指针直接模型原始字符串。

第一个解决方案:

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;
}

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

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

所以更改此信息:

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

进入这个:

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

,然后还用0''(它们是相同)附加withoutSpace,以便任何字符串处理函数都可能知道其结束。还要返回指针,因为您应该这样做,而不是*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分配的内存。

最新更新