gpt4 book ai didi

c - scanf两个整数输入,当第一个输入是某个数字并按下回车键时中断?

转载 作者:行者123 更新时间:2023-11-30 14:53:51 24 4
gpt4 key购买 nike

首先抱歉,因为我是 C 语言新手。

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

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

输出应该类似于

输入两个数字:

1 5
2 8
7 9
-1

计划已结束

最佳答案

一个简单的解决方案

为什么不使用两次 scanf() 调用。第一个检查用户是否输入-1;如果是,则终止循环。请注意,应始终检查 scanf() 返回的值;在这种情况下,返回值可用于确定用户是否输入了数字。如果不是,ab 将保存不确定的值,如果使用,可能会导致未定义的行为。

在此代码中,如果用户在第一个输入中输入 -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;
}

交互示例:

λ> ./a.out
1 2
3 4
5 6
-1
Program has ended
λ> ./a.out
2 7
1 8
2 8
q
Program has ended
λ> ./a.out
3 1
4 1
5 a
Numeric input required
Program has ended

更复杂的解决方案

要满足输入数字仅由一个空格分隔的要求,需要付出更多的努力。实现此目的的一种方法是在第二个 scanf() 格式字符串中使用 %n 指令。该指令不消耗任何输入,也不增加赋值计数器,而是存储当前调用 scanf() 时到目前为止已读取的字符数。用作对 scanf() 的第二次调用:

scanf("%c %n%d", &delim, &num_spaces, &b)

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

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

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

此版本仅接受以单个空格分隔的数字输入,并且仅在第一个位置输入 -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;
}
}

交互示例:

λ> ./a.out
Enter two numbers separated by a single space:
1 2
You entered: 1, 2
Enter two numbers separated by a single space:
3 4
Failure in input format
Enter two numbers separated by a single space:
5 6
Failure in input format
Enter two numbers separated by a single space:
7
8
Failure in input format
Enter two numbers separated by a single space:
9 q
Failure in input format
Enter two numbers separated by a single space:
q 9
Failure in input format
Enter two numbers separated by a single space:
5 -1
You entered: 5, -1
Enter two numbers separated by a single space:
1 2 3 4
You entered: 1, 2
Enter two numbers separated by a single space:
11 12t
You entered: 11, 12
Enter two numbers separated by a single space:
11t 12
Failure in input format
Enter two numbers separated by a single space:
-1
Program has ended

关于c - scanf两个整数输入,当第一个输入是某个数字并按下回车键时中断?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46993221/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com