我正在尝试读取一个可能包含或不包含空格的字符串。 “你好世界”。通过对用户输入的数字选择菜单执行以下操作。这只是我正在尝试做的事情的一个小复制品。
#include <stdio.h>
#include <string.h>
int main(void){
char line[3][80];
strcpy(line[0],"default line 1\n");
strcpy(line[1],"default line 2\n");
strcpy(line[2],"default line 3\n");
for(int i = 0; i < 3; i++){
printf("%s", line[i]);
}
int option = 0;
printf("would you like to replace line 1? (1 for yes)\n");
scanf("%d",&option);
if(option==1){
printf("what would you like to replace the line with?\n");
fgets(line[0],strlen(line[0]),stdin);
}
for(int i = 0; i < 3; i++){
printf("%s", line[i]);
}
}
为什么我输入 1 更改行后,它会打印语句询问我要用什么替换它,并且会自动输入任何内容,然后将第一个字符串打印为空?
我也已经尝试过阅读该行sscanf("%[^\n\t]s", line[0]);
没有任何运气。有任何想法吗?
这是因为
scanf("%d",&option);
留下\n
stdin 中的字符并由第一次调用消耗fgets()
。
这就是为什么最好避免scanf()
完全用C语言。
您可以使用以下方法修复它:
scanf("%d",&option);
getchar(); /* consume the newline */
但我建议使用fgets()
读书option
以及然后你可以使用strtol() http://man7.org/linux/man-pages/man3/strtol.3.html将其转换为整数。
请注意,此声明可能不是您想要的(这限制了您可以阅读的内容)line[0]
).
fgets(line[0],strlen(line[0]),stdin);
您可能想使用:
fgets(line[0],sizeof line[0],stdin);
这样您就可以读取到实际大小line[0]
.
另请阅读 C 常见问题解答条目:http://c-faq.com/stdio/scanfprobs.html http://c-faq.com/stdio/scanfprobs.html
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)