从用户输入的数组中删除空格
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
,如果不使用?
几点建议:
- 初始化
endString
为全零;这样您以后就不必担心字符串终止问题:char endString[PUFFERGROESSE] = {0};
- 不要在
i
小于 PUFFERGROESSE
时循环,而是循环直到看到字符串结尾:for( int i = 0, j = 0; stringPuffer[i] != 0; i++ )
- 另外,当你写非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];
}
}
我想从用户输入中删除所有空格并将结果返回到屏幕上。到目前为止,以下是我的工作解决方案。我还没有注意到任何错误。由于我对 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
,如果不使用?
几点建议:
- 初始化
endString
为全零;这样您以后就不必担心字符串终止问题:char endString[PUFFERGROESSE] = {0};
- 不要在
i
小于PUFFERGROESSE
时循环,而是循环直到看到字符串结尾:for( int i = 0, j = 0; stringPuffer[i] != 0; i++ )
- 另外,当你写非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];
}
}