[英]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;
}
这是输出:
我还想指出,如果我将大小设置为 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.