通过 scanf 检查输入是否正确
Check for correct input via scanf
我有一个整数 'n' 负责稍后输入的数字数量。
我需要在这里检查是否有任何不正确的输入。
'n' 的第一个 scanf
工作正常,但第二个有一些缺陷。
案例如下:
n = 3(例如)- 没关系
那我要scanf
: 1 2 3 4
它将扫描前 3 个值,但我需要抛出一个错误。
同样适用于:1 2 3.5 -(最后一个数字是浮点数,但它仍然是 3)
并带有一个字符:1 2 3g
if (scanf("%d", n) == 1 && getchar() == '\n') {
if (n > NMAX || n < 0) {
error = 1;
return;
}
for (int i = 0; i < n; i++) {
if (scanf("%d", p) == 1) {
唯一正确的输入是在 for
循环中扫描完全相同数量的整数(等于 'n')。
UPD:我只能使用 <stdio.h>
库以及 scanf
.
创建辅助函数来读取 int
并验证它。
关键是要验证输入,形成一个辅助函数,您可以根据需要进行改进,例如使用 fgets()
而不是 scanf()
一旦可怜的“仅 scanf” 要求被删除。
// Sample
// Return 1 on success
// Return EOF on end-of-file
// Else return 0
int read_int(int *i, int min, int max, int line) {
long long num;
int result = scan("%18lld", &num); // Accept many out of int range input
if (result == EOF) return result; // or if (result < 0)
if (line) {
// consume the rest of the line
int ch;
while ((ch = getchar()) != '\n' && ch != EOF) {
if (!isspace(ch)) { // or `ch != ' ' && `ch != '\t' && ...
result == 0;
}
}
}
if (result == 1) {
if (num < min || num > max) {
return 0;
}
*i = (int) num;
}
return result;
}
示例用法
if (read_int(&n, 0, NMAX, 1) != 1) {
error = 1;
return;
}
for (int i = 0; i < n; i++) {
if (read_int(&p, INT_MIN, INT_MAX, i + 1 == n) != 1) {
error = 1;
return;
}
...
注意:read_int()
不会捕获所有错误,只能捕获其中的许多错误。一旦了解了 OP 的所有限制和目标,就很容易改进。
检查这是否有效
while(n-1)
{
scanf("%d ",p);
n-=1;
}
scanf("%d",p);
//After this you can scan again to check if there is anything extra in input
//and throw error accordingly
尝试将扫描集与 scanf 一起使用。 %1[\n]
最多扫描一个换行符。 %99[ \t]
将扫描最多 99 个字符,即 space 或制表符。如果字符不是换行符、space 或制表符,它将在输入流中被替换。
如果 scanf
和 %d
不能扫描一个 int,它将 return 0
。 scanf
也可以 return EOF
.
fgets
并用 strtol
或其他解析是更好的解决方案。
#include <stdio.h>
int main ( void) {
char space[100] = "";
char newline[2] = "";
int number = 0;
int count = 0;
int quantity = 3;
printf ( "enter %d integers\n", quantity);
while ( 1) {
if ( 1 == scanf ( "%d", &number)) {
++count;
}
else {
printf ( "could not parse an integer\n");
break;
}
scanf ( "%99[ \t]", space);
if ( 1 == scanf ( "%1[\n]", newline)) {
if ( count == quantity) {
printf ( "scanned %d integers\n", quantity);
break;
}
else if ( count > quantity) {
printf ( "too many integers\n");
break;
}
else printf ( "enter another integer\n");
}
}
return 0;
}
我有一个整数 'n' 负责稍后输入的数字数量。
我需要在这里检查是否有任何不正确的输入。
'n' 的第一个 scanf
工作正常,但第二个有一些缺陷。
案例如下:
n = 3(例如)- 没关系
那我要scanf
: 1 2 3 4
它将扫描前 3 个值,但我需要抛出一个错误。
同样适用于:1 2 3.5 -(最后一个数字是浮点数,但它仍然是 3)
并带有一个字符:1 2 3g
if (scanf("%d", n) == 1 && getchar() == '\n') {
if (n > NMAX || n < 0) {
error = 1;
return;
}
for (int i = 0; i < n; i++) {
if (scanf("%d", p) == 1) {
唯一正确的输入是在 for
循环中扫描完全相同数量的整数(等于 'n')。
UPD:我只能使用 <stdio.h>
库以及 scanf
.
创建辅助函数来读取 int
并验证它。
关键是要验证输入,形成一个辅助函数,您可以根据需要进行改进,例如使用 fgets()
而不是 scanf()
一旦可怜的“仅 scanf” 要求被删除。
// Sample
// Return 1 on success
// Return EOF on end-of-file
// Else return 0
int read_int(int *i, int min, int max, int line) {
long long num;
int result = scan("%18lld", &num); // Accept many out of int range input
if (result == EOF) return result; // or if (result < 0)
if (line) {
// consume the rest of the line
int ch;
while ((ch = getchar()) != '\n' && ch != EOF) {
if (!isspace(ch)) { // or `ch != ' ' && `ch != '\t' && ...
result == 0;
}
}
}
if (result == 1) {
if (num < min || num > max) {
return 0;
}
*i = (int) num;
}
return result;
}
示例用法
if (read_int(&n, 0, NMAX, 1) != 1) {
error = 1;
return;
}
for (int i = 0; i < n; i++) {
if (read_int(&p, INT_MIN, INT_MAX, i + 1 == n) != 1) {
error = 1;
return;
}
...
注意:read_int()
不会捕获所有错误,只能捕获其中的许多错误。一旦了解了 OP 的所有限制和目标,就很容易改进。
检查这是否有效
while(n-1)
{
scanf("%d ",p);
n-=1;
}
scanf("%d",p);
//After this you can scan again to check if there is anything extra in input
//and throw error accordingly
尝试将扫描集与 scanf 一起使用。 %1[\n]
最多扫描一个换行符。 %99[ \t]
将扫描最多 99 个字符,即 space 或制表符。如果字符不是换行符、space 或制表符,它将在输入流中被替换。
如果 scanf
和 %d
不能扫描一个 int,它将 return 0
。 scanf
也可以 return EOF
.
fgets
并用 strtol
或其他解析是更好的解决方案。
#include <stdio.h>
int main ( void) {
char space[100] = "";
char newline[2] = "";
int number = 0;
int count = 0;
int quantity = 3;
printf ( "enter %d integers\n", quantity);
while ( 1) {
if ( 1 == scanf ( "%d", &number)) {
++count;
}
else {
printf ( "could not parse an integer\n");
break;
}
scanf ( "%99[ \t]", space);
if ( 1 == scanf ( "%1[\n]", newline)) {
if ( count == quantity) {
printf ( "scanned %d integers\n", quantity);
break;
}
else if ( count > quantity) {
printf ( "too many integers\n");
break;
}
else printf ( "enter another integer\n");
}
}
return 0;
}