簡體   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