【问题标题】:scanf in a loop till carriage returnscanf 循环直到回车
【发布时间】:2026-02-14 22:40:02
【问题描述】:

我正在尝试读取具有多个字段的用户输入。但未指定字段数。我想阅读所有的单词,直到回车。我试过这段代码,但它不起作用:

char str[256];
while(1)
{
    scanf("%s", str);
    if(str[strlen(str)] == '\n')
         break;
    else
         printf("Got %s\n", str);

}

用户输入示例:
1. 存储文件1
我需要解析 store 和 file1 并跳出循环。
2. 存储文件1 文件2
我需要解析 store、file1 和 file2 并跳出循环。

想知道如何在回车符处跳出循环。

谢谢。

【问题讨论】:

    标签: c loops while-loop scanf


    【解决方案1】:

    使用

    char str[256]
    scanf("%255[^\n]", str); /*edit*/
    

    读取换行符或(编辑:)255 个字符,以先到者为准。

    【讨论】:

    • 我不知道 scanf 可以使用正则表达式。如果可能的话,您能否发布一些指针来了解它们。
    • @user640639 看看这个page。它不像 RegEx 那样灵活,但仍然非常强大。
    • @user640639 请参阅下面的 elbekay 更正的编辑。道歉。
    • @jonsca \r\n 分隔线怎么样?
    【解决方案2】:

    您可以使用 fgets() 读取,然后使用 strtok() 将缓冲区拆分为标记

    这样你就可以完全控制一切。

    【讨论】:

    • fgets() 如果有空间,会将'\n' 留在字符串中,因此如果他/她想要所有内容直到'\0' /i> '\n'
    • 谢谢。是的,我可以使用 fgets。但我想知道如何使用 scanf 来做到这一点。
    • @user640639 我的回答使用格式说明符来获得遵循缓冲区大小的更安全的 fgets 类型效果。不过,没有理由不使用 fgets 本身。
    【解决方案3】:

    目前,您的 char 数组 str[256] 没有填充任何内容或垃圾,因此当您进行查找时,您不会找到它。

    【讨论】:

    • 我打印出 strlen(str)。它在被解析的单词中返回尽可能多的字符。所以不是 256。
    【解决方案4】:

    试试这个。

    char str[256];
    while(1)
    {
        scanf("%s", str);
        printf("Got %s\n",str);
        if(fgetc(stdin) == '\n')
            break;
    }
    

    【讨论】:

      【解决方案5】:
      char str[256]
      scanf("%256[^\n]", str);
      

      小心该代码。对于长字符串,它将溢出 char 数组。您希望 scanf 中的 %255 容纳空终止符。

      【讨论】:

      • 谢谢。我正试图保护 OP 免受那件事的影响,而我有一个典型的“大脑放屁”。