在循环中使用scanf直到回车符

4

我想读取多个字段的用户输入,但字段数量未指定。我想读取直到回车符为止的所有单词。我尝试了这段代码,但它不起作用:

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

}

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

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

谢谢。

5个回答

3

使用

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

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


我不知道scanf可以使用正则表达式。如果可能的话,您能否发布一些学习它们的指针。 - Romonov
@user640639 请查看这个页面。虽然它不像正则表达式那样灵活,但仍然非常强大。 - jonsca
@user640639 请查看以下elbekay所更正的修改。对此深表歉意。 - jonsca
@jonsca \r\n 分隔的行怎么办? - Jin Kwon

1

试试这个。

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

1

您可以使用fgets()读取,然后使用strtok()将缓冲区拆分成令牌

这样您就可以完全控制所有内容。


如果有空间,fgets()将在字符串中保留'\n',因此,如果用户想要直到'\n'之前的所有内容,他/她必须将其替换为'\0' - jonsca
谢谢。是的,我可以使用fgets。但我想知道如何使用scanf来实现。 - Romonov
@user640639 我的答案使用了格式说明符,以获得更安全的 fgets 类型效果,即遵守缓冲区大小。然而,没有理由不使用 fgets 本身。 - jonsca

1

目前,您的字符数组str [256]为空或包含垃圾数据,因此当您进行查找时,将无法找到它。


我打印了strlen(str)。它返回正在解析的单词中的字符数。因此它不是256。 - Romonov

1
char str[256]
scanf("%256[^\n]", str);

小心那段代码。对于长字符串,它会溢出字符数组。你需要在scanf中使用%255来容纳空终止符。


谢谢。我试图保护OP免受那种事情的影响,但我却犯了一个典型的“脑抽”。 - jonsca

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接