【问题标题】:While Loop isn't repeating?虽然循环不重复?
【发布时间】:2014-07-03 16:55:45
【问题描述】:

这是一道作业题。我正在上 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 行中的 % 前面取出空格,而用户只是按 Enter 键,则计算机将进入无限循环并仅将 gook 打印到屏幕上。 (屏幕上的文字移动得太快,我无法确定,但我“认为”它一直在打印 printf 语句。)

有了空格,用户只需按回车键,它就会将光标向下移动到下一行,直到用户输入有效的字符串然后继续移动。

我希望每次用户按 Enter 键时都重复该问题。我尝试了空的 for(;;),而在这里你可以看到 do-while 的变化。

欢迎任何 cmets。谢谢。

【问题讨论】:

  • IDR my C 但我认为您想要!= 并且您将第一个字母强制为空格,因此它永远不会退出。也许尝试 strlen
  • 为了帮助您查看输出,您可以将其重定向到文本文件。
  • @icbytes 是那句话吗?
  • 应该是一个想法。
  • @icbytes 数组名称(不带下标)已经是您要传递给 scanf 的地址。如果你真的想使用地址操作符,就必须通过 &string[0] (这是相同的,但更神秘)。

标签: c while-loop do-while


【解决方案1】:

我建议使用fgets 而不是scanf,因为出于您的目的,您想要 一次处理一行,并且输入可能包含嵌入的空格。您应该检查用户输入的尾随换行符并去掉它们(通过替换为'\0')。那么你的while 条件应该会按照你想要的方式工作。

【讨论】:

    【解决方案2】:

    没有空格的基本问题是,如果用户只是按Enter,scanf 将失败(因此不会将任何内容写入字符串),并且不会读取任何输入。所以换行符仍然会在输入上,这意味着当你循环时,它会立即再次失败,给你一个无限循环。

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

    【讨论】:

    • 像冠军一样工作!当它使我的 check_palindrome() 函数停止工作时,我准备拔掉头发,但后来我将结束字符搜索更改为 '\n' 而不是 '\0' 并开始像魅力一样工作!谢谢
    【解决方案3】:

    好吧,我会说最好使用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'

    【讨论】:

    • 如果字符串不为空,这将再次提示,这与OP想要的相反。
    • @JimLewis;编辑了答案。
    • 感谢您的反馈。您对 fgets 没有丢弃帮助完成程序的 '\n' 字符的解释。当我转换为 fgets 语句时,我的 check_palindrome() 函数停止工作,但我让它寻找 '\0' 作为字符串的结尾。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多