- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
首先抱歉,因为我是 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()
返回的值;在这种情况下,返回值可用于确定用户是否输入了数字。如果不是,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;
}
交互示例:
λ> ./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/
我的运动需要一些帮助。 Question of exercise 这是我的代码: #include main() { int price,new_price; char code; printf(
这个问题在这里已经有了答案: scanf() leaves the newline character in the buffer (7 个答案) 关闭 5 年前。 我有这段代码(由于逻辑是家庭作业
我这里有一段代码,在输入带空格的字符串时会出现一些不需要的行为。例如 print illegal_argument。当输入包含多个单词时,我希望它只注册第一个单词。 目前发生的是: christian
我的测试输入是 [1,2,3] [4,5,6] [7,8,9] [9,9] 或者它可以是单个 2d 坐标之前的任意数量的 3d 坐标,我的代码是 #include #include #includ
这个问题在这里已经有了答案: What does space in scanf mean? [duplicate] (6 个答案) 关闭 7 年前。 像这样在scanf中加一个空格的目的是什么 sc
#include int main() { int n; scanf("%d", &n); printf(n); return 0; } 这是我的代码,我很愚蠢,可能
程序要求用户输入 2 名学生的姓名、ID 等,将数据写入文件并从文件中读回数据。 #include #include #include #include #include int main(
这个问题在这里已经有了答案: abnormal behavior of scanf [duplicate] (3 个答案) 关闭 8 年前。 今天我遇到了一个问题,当我使用两次接受字符作为输入的 s
我正在用 c 编写一个程序来读取文件的内容。代码如下: #include void main() { char line[90]; while(scanf("%79[^\
main() { int d,a; printf("Enter the digit :"); scanf("%d",&d); printf("Enter another
为什么为 scanf 输入添加多个句点会跳过下一个 scanf 函数。示例输入:b. b. int main (void) { char b[7] = " "; printf("Thi
我想我已经尝试过任何方法(刷新 stdin、scanf 以使用换行符等),但没有任何效果如我所希望的那样。由于某种原因,第三个 scanf 在以下代码中修改了第二个 scanf 中的变量: #incl
这个问题在这里已经有了答案: Scanf skips every other while loop in C (10 个答案) 关闭 6 年前。 我想做一个计算器,只是一个带有循环和基本操作的简单计
如果没有初始化 ("mod=0") ,这段代码进入死循环。我不明白为什么这段代码会循环,即使我使用了 getchar();删除缓冲区。当我先输入“1”,然后再输入“a”时,就会出现无限循环。谁能帮助我
当我为 scanf() 输入一个值时 它只是跳过紧随其后的第二个、第三个和任何其他 scanf()。 这是我的代码: #define _CRT_SECURE_NO_WARNINGS #include
#include #include void sstring(); int main() { char ch1[10],ch2; printf("Ent
这是一个计算房间内人员年龄的简单程序。我正处于初始阶段,现在我看到我不知道哪些变量(我的意思是我在 scanf 之前声明的变量,然后是 scanf 中的占位符)用于 scanf;如何选择和应用正确的变
这个问题在这里已经有了答案: scanf() leaves the newline character in the buffer (7 个答案) 关闭 5 年前。 我知道 scanf() 的用法,
我已经阅读了扫描集的行为。通过研究和测试,我遇到了一个问题。 难道 scanf("%[^\n]") 的行为与 scanf("%s") 一样吗? scanf("%s") 正在消耗字符,直到在 stdin
我遇到了一个问题,当我使用 scanf 将字符串存储到 char 指针中时,我有 3 个输入 - 姓名、姓氏和年龄,姓氏的最后一个 char 值被替换为年龄输出以更好地解释。 Q-riosity v0
我是一名优秀的程序员,十分优秀!