这是一个家庭作业问题。我正在上C编程课。我现在正在使用的要求是
"如果输入空消息,则应提示用户输入非空消息,直到他们输入至少1个字符长的消息。"
这是我现在的代码:
int main(void)
{
char string[101];
int menu;
do
{
printf("Enter a text message (maximum 100 characters long) : ");
scanf(" %100[^\n]s", string);
}
while (string[0] == '\0');
如果我在scanf行中的%前面占用空格,并且用户只是点击进入,则计算机进入无限循环并且只是将gook打印到屏幕上。 (屏幕上的文字移动太快,我无法确定,但我认为'它会不断打印printf语句。)
如果有空格,并且用户只是点击进入,它会将光标向下移动到下一行,直到用户输入有效字符串然后继续。
我希望每次用户点击进入时都会重复这个问题。我已经尝试为(;;)空了,而在这里你会看到do-while变体。
欢迎任何评论。感谢。
答案 0 :(得分:3)
我建议您使用fgets
而不是scanf
,因为您的目的,是您想要的
一次处理一行,输入可能包含嵌入的空格。您应检查用户的输入以获取尾随换行符并将其删除(通过替换为'\0'
)。那么你的while
条件应该按照你想要的方式工作。
答案 1 :(得分:1)
好吧,我会更好地使用fgets
:
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
char string[101];
int menu;
do
{
printf("Enter a text message (maximum 100 characters long) : ");
fgets(string, 100, stdin);
}while (string[0] == '\n');
}
您应该注意fgets
不会丢弃\n
字符并将其读取。当您按 Enter 时,\n
将存储在string[0]
。因此,您需要检查string[0] == '\n'
。
答案 2 :(得分:1)
没有空格的基本问题是,如果用户只是按 Enter ,则scanf将失败(因此不会将任何内容写入字符串),并且NO INPUT将被读取。所以换行仍然在输入上,这意味着当你循环时,它会立即再次失败,给你一个无限循环。
使用空格,scanf调用将读取并忽略空格(包括换行符)而不返回,因此当用户点击 Enter 时,它将保留在scanf中。
最简单的解决方案是使用fgets:
do {
printf("Enter a text message (maximum 100 characters long) : ");
if (!fgets(string, sizeof(string), stdin)) {
/* error or eof */
exit(1); }
} while (string[0] == '\n');
但是这不会忽略该行上的前导空格,并且会接受仅由空格组成的行。如果你想要,你需要像:
char *p;
do {
printf("Enter a text message (maximum 100 characters long) : ");
if (!fgets(string, sizeof(string), stdin)) {
/* error or eof */
exit(1); }
p = string + strspn(string, " \t"); /* skip over leading spaces and tabs */
} while (p[0] == '\n' || p[0] == 0);
scanf
的一个主要限制是它不擅长区分空格和换行符 - 它同时处理空格。