从用户输入的数组中删除空格

Removing spaces from array input by user

我想从用户输入中删除所有空格并将结果返回到屏幕上。到目前为止,以下是我的工作解决方案。我还没有注意到任何错误。由于我对 C 和一般编程还很陌生,所以我的问题是:有什么我可以做得更好的吗?有什么要优化的吗?我感谢你们的任何提示,因为你们可能比我更有经验。所以,这是我的代码:

#include <stdio.h>
#include <string.h>
#define PUFFERGROESSE 100
#define ERROR 1
#define OK 0

int main(){

    char stringPuffer[PUFFERGROESSE];
    printf("Please enter some words:"); fflush(stdout);
    if(fgets(stringPuffer, PUFFERGROESSE, stdin) == NULL){
        printf("Unable to read.\n");
        return ERROR;
    } else {
        char endString[PUFFERGROESSE];

        for (int i = 0, j = 0; i < PUFFERGROESSE; i++, j++) {
            if (stringPuffer[i] != ' ' ) {
                endString[j] = stringPuffer[i];
            } else {
                j--;
            }
        }


        printf("Without spaces your input looks like that: %s", endString);
    }
}

在您的代码中,for 循环条件是 i < PUFFERGROESSE。在此循环内,您使用循环索引访问 stringPuffer

现在,stringPuffer 是一个未初始化的自动局部变量并且输入足够小,像 i < PUFFERGROESSE 这样的严格检查将导致访问 stringPuffer 的未初始化内存,创建 undefined behavior.

您可以在接受用户输入后使用 strlen()

另请注意,至少 int main()int main(void) 更好。

NITPICK:为什么要定义 OK,如果不使用?

几点建议:

  1. 初始化endString为全零;这样您以后就不必担心字符串终止问题:
    char endString[PUFFERGROESSE] = {0};
    
  2. 不要在 i 小于 PUFFERGROESSE 时循环,而是循环直到看到字符串结尾:
    for( int i = 0, j = 0; stringPuffer[i] != 0; i++ )
    
  3. 另外,当你写非space字符时只增加j,而不是无条件地增加它然后当你看到space时必须减少它:
    if ( !isspace( stringPuffer[i] ) )
      endString[j++] = stringPuffer[i];
    

基本上,该代码简化为:

char endString[PUFFERGROESSE] = {0};

for (int i = 0, j = 0; stringPuffer[i] != 0; i++) {
  if ( !isspace( stringPuffer[i] ) ) {
      endString[j++] = stringPuffer[i];
  }
}