[英]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.