虽然Loop不重复?

时间:2014-07-03 16:55:45

标签: c while-loop do-while

这是一个家庭作业问题。我正在上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变体。

欢迎任何评论。感谢。

3 个答案:

答案 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的一个主要限制是它不擅长区分空格和换行符 - 它同时处理空格。