我想使用scanf()
阅读下表:
Q 1 3
U 2 6
Q 2 5
U 4 8
这是我的密码:
#include <stdio.h>
#include <stdlib.h>
void main() {
int *a;
int i, j;
a = (int *) malloc(4 * 3 *sizeof(int));
printf("input:\n");
for (i = 0; i < 4; i++) {
for (j = 0; j < 3; j++) {
scanf("%d", a + 3 * i + j);
}
}
printf("output:\n");
for (i = 0; i < 4; i++) {
for (j = 0; j < 3; j++) {
printf("%d ", a[3*i+j]);
}
printf("\n");
}
}
但是,当我输入第一行Q 1 3
时,这个程序就结束了。我也不知道原因?
发布于 2016-08-22 01:04:53
之所以会出现这种情况,是因为您向程序提供了一个非数字输入,希望用%d
读取一个数字。由于Q
不是一个数字,所以scanf
失败。
但是,您的程序没有注意scanf
的返回值,而是一直在失败状态下调用它。这个程序认为它得到了一些数据,而实际上却没有。
要解决这个问题,修改代码以在读取非数字字符时传递%c
或%s
,检查scanf
的返回值,并在scanf
失败时删除无效的输入。
调用scanf
时,它将返回与其提供的%
说明符对应的值。下面是如何检查scanf
的返回值
if (scanf("%d", a + 3 * i + j) == 1) {
... // The input is valid
} else {
fscanf(f, "%*[^\n]"); // Ignore to end of line
}
发布于 2016-08-22 01:02:41
这是因为字母q不是一个数字,所以scanf
会失败,并且不动输入缓冲区。因此,下一次迭代scanf
将看到相同的q,然后再次失败,等等。
这将意味着实际上没有任何东西被读取到您分配的内存中,然后打印出未初始化的内存,从而导致未定义的行为。
解决问题的一种可能方法可能是读取行(例如使用fgets
),然后使用sscanf
一次性解析整行。也许就像
for (i = 0; i < 4; i++) {
char buffer[64];
if (fgets(buffer, sizeof buffer, stdin) != NULL) {
char c; // The character
int a, b; // The integer values
sscanf(buffer, "%c %d %d", &c, &a, &b);
a[3 * i + 0] = c;
a[3 * i + 1] = a;
a[3 * i + 2] = b;
}
}
我还建议您实际初始化所分配的内存,特别是如果您不使用其中的部分,但仍然打印出来。
发布于 2016-08-22 01:41:51
要么使用带有适当ASCII值的int变量的scanf()
,要么使用带有char变量的scanf()
作为字符,但在这两种情况下都使用%c。Q的ASCII码为81,U为85。
https://stackoverflow.com/questions/39075225
复制