如何动态获取整数输入并让循环在按回车键时终止?

How can I take integer input dynamically and have the loop terminate on pressing enter?

我需要动态获取整数输入,并在用户按下回车键后立即终止。当我将字符作为输入时,我从来没有遇到过任何问题,因为我可以轻松检查换行符并且每个字符都是一个字符。但是在这里,我不能只接受一个字符输入并将其减去“0”,因为当我输入 10 时,字符值是 1 然后是 0。

这是我正在使用的一段代码:

int no;
while (scanf_s(" %d", &no) == 1)
    {
        printf("%d ", no);
    }

这是我用来输入字符的另一段代码,它也适用于单个数字整数:

char no;
while ((no=getchar()) != EOF && no != '\n')
    {
        printf(" %d ", no - '0');
    }

scanf 循环不会在按下 enter 时终止,但它会正确地接受所有输入。而 getchar 循环正确终止但仅存储 1 位整数。

如何让整数输入在用户输入空白行时终止?

您可以使用标准函数 fgets 将输入读入字符数组,然后使用标准函数 strtol.

提取数字

这是一个演示程序

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int is_empty( const char *s )
{
    return s[strspn( s, " \t" )] == '\n';   
}

int main(void) 
{
    enum { N = 100 };
    char line[N];

    while ( fgets( line, N, stdin ) && !is_empty( line ) )
    {
        char *endptr;

        for ( const char *p = line; *p != '\n'; p = endptr )
        {
            int num = strtol( p, &endptr, 10 );
            printf( "%d ", num );

        }
    }

    return 0;
}

如果输入以下几行

1
2 3
4 5 6
7 8
9

(最后一行为空,表示用户刚刚按下回车)

那么输出会像

1 2 3 4 5 6 7 8 9