C 扫描两个整数输入,当第一个输入为某个数字并按enter键时中断?

C 扫描两个整数输入,当第一个输入为某个数字并按enter键时中断?,c,for-loop,C,For Loop,在开始的时候道歉,因为我是C的新手 我使用scanf输入两个由单个空格分隔的整数变量。scanf在for循环中,但是如果第一个输入类似于-1,我想终止for循环。这是我的密码 int x,a,b; for(a=0;a!=-1;) { printf("enter two numbers: \n"); scanf("%d %d",&a,&b); } printf("Program has ended"); 输出应该类似于 输入两个数字: 15 2 8 7 9 -一,

在开始的时候道歉,因为我是C的新手

我使用scanf输入两个由单个空格分隔的整数变量。scanf在for循环中,但是如果第一个输入类似于-1,我想终止for循环。这是我的密码

int x,a,b;
for(a=0;a!=-1;)
{
    printf("enter two numbers: \n");
    scanf("%d %d",&a,&b);
}
printf("Program has ended");
输出应该类似于

输入两个数字:

15 2 8 7 9 -一,

程序已结束

请尝试放置x=a之类的内容,因为您的循环是无止境的。 您没有在循环中更改x的值

其中一种可能性是:

int x,a,b;
for(x=0;x!=-1;)
{
    printf("enter two numbers: ");
    scanf("%d %d",&a,&b);
    x = a;
}
printf("Program has ended");
简单的解决办法 为什么不给scanf打两个电话呢。第一个检查用户是否输入-1;如果是,则循环终止。请注意,应始终检查scanf返回的值;在这种情况下,返回值可用于确定用户是否输入了数字。否则,a或b将保留不确定的值,如果使用,可能会导致未定义的行为

在该代码中,如果用户为第一个输入输入-1,或为任一输入输入非数值,则循环终止。请注意,此代码和发布代码中的数字可能由任意数量的空白字符分隔。只接受一个空格作为分隔符需要更多的技巧

#include <stdio.h>

int main(void) {
    int a;
    int b;

    while ((scanf("%d", &a) == 1) && a != -1) {
        if (scanf("%d", &b) != 1) {
            puts("Numeric input required");
            break;
        } else {
            /* do something with a and b */
        }
    }

    puts("Program has ended");

    return 0;
}
更复杂的解决方案 它需要更多的努力来满足输入数字之间仅用一个空格分隔的要求。实现这一点的一种方法是在第二个scanf格式字符串中使用%n指令。此指令不消耗任何输入,也不增加赋值计数器,但存储当前对scanf调用中已读取的字符数。用作对scanf的第二个调用:

delim应该保存空格字符的值,num_spaces应该保存值1(如果只有一个空格),b应该保存用户输入值。如果delim不是空格,或者num_spaces不是1,或者如果调用scanf返回的值不是2,则输入与预期格式不匹配

在下面的示例中,如果用户为第一个输入输入-1,则输入循环终止。否则将验证用户输入。如果第一次输入不是数字,则会打印错误消息,并提示用户再次输入。如果第二个输入不是数字,或者如果两个输入值之间没有空格字符,则会打印一条错误消息,并提示用户再次输入

请注意,当输入验证失败时,输入流中将至少保留一个换行字符,可能还有更多字符。为了防止这些无关字符干扰下一次用户交互,必须将它们从输入流中删除。为此,增加了clear_输入功能;在输入失败后调用它,以便在继续操作之前进行清理。即使输入有效,也会调用clear_输入函数,以确保忽略输入流中的任何额外字符

此版本仅接受由单个空格分隔的数字输入,并且仅在第一个位置输入-1时退出。输入行中接受前导空格;一种类似于应用于第二个输入的技术可以应用于第一个输入,以强制在输入格式中不使用前导空格。不接受多个空格、制表符和换行符作为两个输入数字之间的分隔符。这一准则可以进一步完善;请注意,前两个输入数字之后的任何值都将被忽略。相反,代码可以考虑这样的输入无效,并且需要严格遵守数字空间编号行格式。

#include <stdio.h>

void clear_input(void);

int main(void) {
    int a;
    int b;

    for (;;) {
        puts("Enter two numbers separated by a single space:");
        int ret = scanf("%d", &a);
        if (ret != 1) {                      // start again for bad input
            puts("Failure in input format");
            clear_input();
            continue;
        }
        if (a == -1) {                       // exit only for -1 in first input
            break;
        }

        char delim;
        int num_spaces;
        if (scanf("%c %n%d", &delim, &num_spaces, &b) != 2
            || delim != ' '
            || num_spaces != 1) {
            puts("Failure in input format");
            clear_input();
            continue;
        } else {
            clear_input();                   // remove any extraneous characters
            /* do something with a and b */
            printf("You entered: %d, %d\n", a, b);
        }
    }

    puts("Program has ended");

    return 0;
}

void clear_input(void)
{
    int ch;
    while ((ch = getchar()) != '\n' && ch != EOF) {
        continue;
    }
}

@xing FGET超出了我的范围,当然我这么做的原因很不幸:若我使用fgets@xing不幸的是,没有:sorry@xing如果允许我使用%[\n],我该怎么做?@xing问题是输出应该与下面所写的完全相同。因此,a和b的输出之间应该只有一个空格,当只输入a且为-1时,程序退出。我的CS老师喜欢让我们的生活变得艰难:对不起,你可能需要更仔细地考虑你的要求。如果用户在第一次输入时输入了字母字符,该怎么办?程序应该退出,还是应该提示用户再次输入?这取决于你,但你不能忽视这个问题。如果用户在需要数字时输入字母,则关联变量中不会存储任何值,因此您可能有一个不确定的值;这可能导致未定义的行为。解决方案的一个基本特性是检查scanf的返回值。在C语言中处理用户输入是很棘手的。两个scanf的问题是a和b的输入之间应该只有空格,而不是换行符。我知道这听起来很愚蠢,但这是我教授的要求。这适用于t上的两个输入
同一行,即输入12。请注意,发布的代码和我答案中的代码也适用于输入,例如1\n2\n。关键的一点是\n字符只是空白字符,这是空格在scanf格式字符串中的含义。@StannisBaratheon-我已经用一个版本更新了我的答案,该版本满足了输入数字之间单个空格的更严格要求。此版本更紧密地验证用户输入,例如,不允许在两行上输入,或使用制表符分隔的输入。
#include <stdio.h>

void clear_input(void);

int main(void) {
    int a;
    int b;

    for (;;) {
        puts("Enter two numbers separated by a single space:");
        int ret = scanf("%d", &a);
        if (ret != 1) {                      // start again for bad input
            puts("Failure in input format");
            clear_input();
            continue;
        }
        if (a == -1) {                       // exit only for -1 in first input
            break;
        }

        char delim;
        int num_spaces;
        if (scanf("%c %n%d", &delim, &num_spaces, &b) != 2
            || delim != ' '
            || num_spaces != 1) {
            puts("Failure in input format");
            clear_input();
            continue;
        } else {
            clear_input();                   // remove any extraneous characters
            /* do something with a and b */
            printf("You entered: %d, %d\n", a, b);
        }
    }

    puts("Program has ended");

    return 0;
}

void clear_input(void)
{
    int ch;
    while ((ch = getchar()) != '\n' && ch != EOF) {
        continue;
    }
}