繁体   English   中英

尽管退出循环,从给定字符串中删除所有空格的 C 程序会打印一些额外的文本

[英]C program to remove all spaces from a given string prints some extra text despite exiting loop

我编写了一个程序来删除给定字符串中的所有空格,并使用循环遍历字符串以移动空格并将文本添加到新字符串中。 代码会执行此操作,但也会打印一些额外的文本(原始字符串的最后几个字符),尽管它没有处于循环中并且没有被添加到新字符串中。

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

int main(){
    char str[] = "   My name is Harry   123 "; //Initial string
    char newStr[] = "";    //New string with no spaces
    for(int i = 0, j = 0;i<strlen(str);i++){   //running a loop with i and j to check 
                                                and move over spaces and only add text 
                                                 in newStr
        if(str[i] == ' '){
            continue;
        }
        else{
            newStr[j] = str[i];
            j++;
        }
    }
    printf("%s",newStr); //Printing the newStr
    return 0;
}

这是输出:

我的名字是Harry123arry 123

我还想指出,如果我将大小设置为 newStr,或者如果我使用“i<=strlen(str)”而不是“i<strlen(str)”,我的程序运行良好。

我认为这是因为 c 中的字符串它们存储的最后一个字节是 '\0' ,表示字符串的结尾。

对于“Harry”,它就像“Harry\0”

问题是 strlen() 只给出 '\0' 之前的字符数。 您正在打印垃圾,因为您构建的字符串末尾不会有 '\0' 字符。 但是使用 <= 你也会读入那个不等于''的空字符并将它放入你的 newStr[] 中。

我希望这对你有帮助!

首先,您需要在构建时动态分配内存 newStr,或者在初始化时给它足够大的大小,因为现在它只有 1 个字节长('\0'),任何超过这个长度的尝试都会抛出 valgrind invalid写入可能出现段错误的错误。

然后,当您完成复制它时,您必须在末尾加上一个 '\0' 以防止任何读取它的尝试过冲(就像 printf 可能做的那样)。

重新分配示例:

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

int main() {
  char str[] = "   My name is Harry   123 ";
  char *newStr = NULL;
  int j = 0;

  for (int i = 0, len = strlen(str); i < len; i++) {
    if (str[i] != ' ') {
      newStr = (char *)realloc(newStr, sizeof(char) * (j + 2)); // new char and '\0'                             
      newStr[j] = str[i];
      j++;
    }
  }
  newStr[j] = '\0';

  printf("%s\n", newStr);
  free(newStr);

  return 0;
}

预分配示例:

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

int main() {
  char str[] = "   My name is Harry   123 ";
  char *newStr = NULL;
  int lenNewStr = 0;
  int j = 0;

  for (int i = 0; str[i] != '\0'; i++)
    if (str[i] != ' ') lenNewStr++;
  newStr = (char *)malloc(sizeof(char) * (lenNewStr + 1));

  for (int i = 0, len = strlen(str); i < len; i++) {
    if (str[i] != ' ') {
      newStr[j] = str[i];
      j++;
    }
  }
  newStr[j] = '\0';

  printf("%s\n", newStr);
  free(newStr);

  return 0;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM