簡體   English   中英

為什么scanf無法讀取我的輸入?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM