gpt4 book ai didi

c - 如何防止用户输入比 C 中要求的更多或更少的输入?

转载 作者:行者123 更新时间:2023-12-01 12:23:33 25 4
gpt4 key购买 nike

我希望用户只输入两个整数,不超过两个或小于两个。此外,在无效输入时,我希望打印错误并提示用户再次输入这两个整数。用户应输入两个由空格分隔的整数,而不是换行符。因此,例如:
1) 有效输入为:1 2
2) 无效输入:1
3) 无效输入:1 2 3

我尝试过以下两种方法:

#include<stdio.h>

int main(){

int first;
int second;
printf("Enter input:\n");
int returnValue = scanf("%d %d", &first, &second);
while(returnValue != 2){
printf("Invalid input. Please enter again: \n");
returnValue = scanf("%d %d", &first, &second);
}
printf("First: %d Second: %d\n", first, second);
return 0;
}

在涉及 scanf 的第一种方法中,我无法阻止用户在换行符上输入每个整数。我也不能将输入限制为仅 2 个数字。也就是说,如果用户输入超过 2 个整数,则程序将接受前 2 个整数并忽略第三个。在这种情况下,我想打印错误。

我的其他方法涉及 fgets 和 sscanf:

#include<stdio.h>

int main(){

int first;
int second;
printf("Enter input:\n");
char line[20];
fgets(line, sizeof(line), stdin);
int returnValue = sscanf(line, "%d %d", &first, &second);

while(returnValue != 2){
printf("Invalid input. Please enter again: \n");
fgets(line, sizeof(line), stdin);
returnValue = sscanf(line, "%d %d", &first, &second);
}

printf("First: %d Second: %d\n", first, second);
return 0;
}

在这种方法中,如果用户在仅输入一个整数后按下回车键,我可以打印错误。但我无法将输入限制为仅 2 个数字。也就是说,如果用户输入超过 2 个整数,则程序将接受前 2 个整数并忽略第三个。在这种情况下,我想打印错误。

所以我的问题是,我的要求是否可以通过修改第一种方法和第二种方法来实现?

谢谢。

最佳答案

一个解决方案是在两次 %d 转换之后使用 %n 转换规范。 %n 转换规范不匹配任何字符,而是将读取到此时的字符数存储在格式字符串中。所以,在通话中:

sscanf(line, "%d %d %n", &first, &second, &bufPos);

如果到达第二个 %d,则 bufPos 将保存 line 中读取的最后一个字符之后的字符索引。由于 %n 之前有一个空格,因此在将索引值存储到 bufPos 之前,将读取并跳过零个或多个空白字符。因此,在有效输入后,bufPos 将指示 \0 终止符。如果在此索引处的 中发现任何其他字符,则表明输入中存在无关字符。

这是您的第二个代码示例的修改版本。 fgets()读取一行输入后,sscanf()用于扫描字符串。如果少于 2 次匹配,或者 line[bufPos] 不是 '\0',则 badInput 设置为 。输入循环是一个执行一次的 do 循环,只要 badInputtrue 就会继续执行。

#include <stdio.h>
#include <stdlib.h> // for exit()
#include <stdbool.h> // for bool type

#define BUF_SIZE 100

int main(void)
{
int first;
int second;
char line[BUF_SIZE];
int returnValue;
int bufPos;
bool badInput = false;

do {
if (badInput) {
printf("Invalid input. Please enter again: ");
badInput = false;
} else {
printf("Enter input: ");
}
if (fgets(line, sizeof(line), stdin) == NULL) {
perror("Error in fgets()");
exit(EXIT_FAILURE);
}

returnValue = sscanf(line, "%d %d %n", &first, &second, &bufPos);

if (returnValue < 2 || line[bufPos] != '\0') {
badInput = true;
}

} while (badInput);

printf("First: %d Second: %d\n", first, second);

return 0;
}

示例交互:

Enter input: 1
Invalid input. Please enter again: 1 2 3
Invalid input. Please enter again:
Invalid input. Please enter again: 1 2
First: 1 Second: 2

关于c - 如何防止用户输入比 C 中要求的更多或更少的输入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41916734/

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