2016-08-22 38 views
3

我想使用scanf()爲下表閱讀:爲什麼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"); 
    } 
} 

enter image description here

然而,當我輸入的第一行Q 1 3,該程序結束。我不知道爲什麼?

+1

申報'A'如'char'指針和使用'的scanf( 「%C」,一個+ 3 * I + J);'。 '%c'之前的空格是有意的。還要將'printf(「%d」,a [3 * i + j]);'改爲'printf(「%c」,a [3 * i + j]);'。 (我假設在輸入中只使用一個數字號碼)。 – haccks

+0

請不要張貼動畫GIF。如果您完全沒有發佈圖片,最好將複製/粘貼到問題中並將其標記爲代碼。 – Barmar

回答

5

發生這種情況是因爲您向想要讀取%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 
} 
1

這是因爲字母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; 
    } 
} 

我也建議你實際上初始化你分配的內存,特別是如果你不打算使用它的一部分,但仍把它打印出來。

+0

所以我想知道如何處理它? – xyz

+1

@ShutaoTang [scanf](http://linux.die.net/man/3/scanf)返回成功匹配的項目數量... – LPs

0

要麼使用scanf()與int變量與適當的ASCII值或使用scanf()與char變量字符但在這兩種情況%C打印。爲Q ASCII碼爲81和用於Ü它是85.