我想从用户输入中删除任何空格,并将结果返回到屏幕上。到目前为止,以下是我的工作解决方案。我还没有发现任何错误。由于我对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);
}
}
答案 0 :(得分:3)
在您的代码中,for
循环条件为i < PUFFERGROESSE
。在此循环中,您可以使用循环索引访问stringPuffer
。
现在,stringPuffer
是一个未初始化的自动局部变量,并且输入足够小,像i < PUFFERGROESSE
这样的严格检查将导致访问未stringPuffer
的未初始化内存,从而创建undefined behavior }。
您可以在接受用户输入后使用strlen()
。
另一个注意事项,int main()
至少比int main(void)
更好。
NITPICK:为什么定义OK
,如果没有使用?
答案 1 :(得分:1)
几点建议:
endString
初始化为全零;这样你以后就不用担心字符串终止问题:char endString[PUFFERGROESSE] = {0};
i
小于PUFFERGROESSE
时循环,而不是循环,直到看到字符串的结尾为止:for( int i = 0, j = 0; stringPuffer[i] != 0; i++ )
j
,而不是无条件地递增它,然后在看到空格时必须递减它: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];
}
}