【问题标题】:How know breakline with scanf()如何使用 scanf() 知道断线
【发布时间】:2016-09-03 19:50:06
【问题描述】:

我只需要阅读一行,其中包含用空格分隔的整数

输入:1 41 2 15 6 7 87 4 2 1 9 0

我的代码可以使用

读取每个数字
int number;
while(scanf("%d", &number) == 1) { 
    printf("%d", number);
}

当我发送一些字符时while循环结束,当用户按下回车时我该怎么做while循环结束?

我的程序做了什么
输入第 1 行: 1 2 3 4 5 6 --这里我按回车
输入第 2 行: b -发送一些奇怪的字符来完成

我想要什么
输入第 1 行: 1 2 3 4 5 6 --这里我按回车完成

【问题讨论】:

  • @user3121023 不,我有一个未定义的输入大小。例如,输入可以是“1 2 3 5”或“9 8 7 32 12 3 45 6 73 123 9”。函数 fgets() 需要一些大小。
  • 从根本上说,如果您想要基于行的输入,请不要使用scanf() 或fscanf(),因为它们都不会关注行边界——它们将换行符视为任何其他空白特点。如果要处理一行数据,读取一行数据(fgets()或getline()),然后用sscanf()解析该行。

标签: c


【解决方案1】:

您的整数通常用空格分隔,除非您阅读最后一个。在这种情况下,它后面跟着一个换行符:

char next_char;
int number;

while (scanf("%d%c", &number, &next_char) == 2) {
    /* some stuff */
    if (next_char == '\n') break;
}

【讨论】:

  • 这很好,只要输入不允许在行尾之前有空格。
  • 请注意,“空白”通常包含换行符作为有效字符之一。 isspace() 和 isblank() 函数说明了这一点。 […嗯; POSIX 页面并不是那么有用; Mac OS X 上的 man isblank isspace 显示 isblank() 识别制表符和空白,但 isspace 识别空白、制表符、换行符、垂直制表符、换页、回车……]
  • @JonathanLeffler:是的,没错,我只是想念这个字符的英文单词 ` `... 它是什么?
  • 可能是空白或空格(或可能是制表符);查看我的评论的扩展版本。
【解决方案2】:

如果缓冲区足够,fgets 将读取并包含一个换行符。
这些值可以用sscanf 解析。对于未知数量的值,请使用 %n 说明符遍历输入。 %n 记录扫描处理的字符数。这里每次扫描使用的字符都在offset中累积。

#include <stdio.h>

#define SIZE 200

int main( void)
{
    char input[SIZE] = { '\0'};
    int used = 0;
    int offset = 0;
    int number = 0;

    if ( ( fgets ( input, SIZE, stdin))) {
        while ( ( sscanf ( &input[offset], "%d%n", &number, &used)) == 1) {
            offset += used;
            printf ( "%d\n", number);
        }
    }
    else {
        fprintf ( stderr, "problem getting input\n");
    }

    return 0;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-08-24
    • 2010-10-21
    • 1970-01-01
    • 2017-10-17
    • 2019-03-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多