// UNTESTED ILLUSTRATIVE CODE
#include <stdio.h>
#include <stdlib.h>
#define ARRAY_N 1001
#define CHAR_PER_INT 11
// Return a number of `int`s read.
// Return -1 on error.
int read_1_line_of_ints(int n, int a[]) {
// Form a buffer 2x enough for worse-case input.
#define BUF_N (ARRAY_N * (CHAR_PER_INT + 1) * 2 + 1 + 1)
char buf[BUF_N];
if (fgets(buf, sizeof buf, stdin) == NULL) {
return 0; // No input
}
const char *p = buf;
int i = 0;
while (*p) {
char *end;
errno = 0;
long value = strtol(p, &end, 10);
if (p == end) {|
// No conversion
if (*p == '\n') {
break;
}
// Non numeric input
return -1;
}
if (errno || value > INT_MAX || value < INT_MIN) {
// Value out of int range
return -1;
}
if (i >= n) {
// Too many
return -1;
}
if (*p - buf + 1 >= sizeof buf) {
// We are too close to the end and
// may have failed to read in all the number.
return -1;
}
a[i++] = (int) value;
p = end;
}
return i;
}
// Usage
int n = sizeof a/sizeof a[0];
int count = read_1_line_of_ints(n, a);
2条答案
按热度按时间ajsxfq5m1#
将最多N
int
的行读入数组fgets()
来读取用户输入的 * 行 *。避免scanf()
,直到你知道为什么它是坏的。int
范围之外的值和非数字输入。建议为用户输入提供2倍大小的缓冲区。这处理了很多问题。有些人还没有做到:
ARRAY_N
的输入?buf[BUF_N]
还不够时怎么办?'\n'
之外的其他空白。读取输入
x, y
读入大小为1的数组,两次
我明天会更深入地复习,并提供更多细节。
46qrfjad2#
您正在使用while循环将值读入数组,而与实际值是否属于数组无关。你需要检查
scanf
是否匹配while循环中的输入结束,你还需要检查int值后面的字符是否是换行符或其他字符: