[英]Why scanf cannot read my input?
我想使用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
,該程序結束。 我不知道為什么?
發生這種情況是因為您為程序提供了一個非數字輸入,希望讀取%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
}
這是因為字母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;
}
}
我還建議你實際初始化你分配的內存,特別是如果你不打算使用它的一部分但仍然打印出來。
要么使用scanf()
與int變量適當ASCII值或使用scanf()
與字符char變量但在這兩種情況下%C打印。 Q的 ASCII碼為81, U為85。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.