2011-03-23 72 views
3

即時通訊新的C和不能爲我的生活弄清楚我在這裏做錯了什麼。第一個scanf工作正常,變量在讀入時打印出來。第二個scanf似乎沒有正確讀取輸入。輸入格式爲「char int int」,即當我打印opb x和y out,opb =「」,x = 13238272,y = 0時,輸出格式爲b 4 4
。 什麼想法?.....注IVE切出代碼的問題C scanf()問題

int main(void) 
{ 

/*initialize variables*/ 
int width, height; 
char op; 

/*grid input*/ 
scanf("%c %d %d", &op, &width, &height); 

/*check conditions*/ 
if (op != 'g' || width>100 || height>100 || width*height<10 || width<1 || height<1) { 
    printf("grid-error\n"); 
    return 0; 
} 

/*initialize grid elements*/ 
int grid[width][height]; 
char printGrid[width][height]; 

/*create grid elements*/ 
int i, j; 
for (i=0; i<height; i++) { 
    for (j=0; j<width; j++) { 
     grid[j][i] = 0; 
     printGrid[j][i] = '*'; 
    } 
} 

/*print successful creation*/ 
printf("%c %d %d \n", op, width, height); 

int k; 
for (k = 0; k<10; k++) { 
    /*initialize variables*/ 
    int x, y; 
    char opb; 

    /*mine input*/ 
    scanf("%c %d %d", &opb, &x, &y); 

    /*check conditions*/ 
    if (opb != 'b' || x<0 || y<0 || x>(width-1) || y>(height-1) || grid[x][y] == 9) { 
     printf("mine-error\n"); 
     return 0; 
    } 
+0

您應該檢查scanf函數的'()'的返回值,因爲它是你就會知道,如果有一個格式錯誤的唯一方法。 – geekosaur 2011-03-23 06:04:17

+1

你看起來是一個格式錯誤(因爲它沒有返回3),這是怎麼回事? – Milk 2011-03-23 06:13:07

+1

@ user445559:我發生的一件事情是,'%c'將讀取下一個可用字符 - 即使它是空格或讀取上一行時留下的換行符。一般來說,以行的形式讀取輸入並使用'sscanf()'來解析它們會更安全。 – geekosaur 2011-03-23 06:15:30

回答

4

下面我懷疑的問題是,你不處理換行符在你的輸入。結果是opb實際上是一個換行符(不是空格,雖然它看起來像一個),並且xy根本不被讀取(即它們保留它們被初始化的值)。

要解決此問題,請嘗試向兩個scanfs添加換行符。那就是:

scanf("%c %d %d\n", &op, &width, &height); 

後來

scanf("%c %d %d\n", &opb, &x, &y); 
+0

謝謝,我試過這個,但現在它只是掛在第一個scanf() ,所以輸入: 「g 10 10 」它會轉到下一行,直到我按ctrl + d,然後它繼續,因爲它應該 – Milk 2011-03-23 22:58:14

+0

是的,我相信這是由於鍵盤輸入緩衝的方式。如果您將第一個scanf更改爲'scanf(「%c%d%d」,&op,&width,&height);'並將第二個scanf更改爲'scanf(「\ n%c%d%d」,&opb,&x ,&y);'它不會掛起,關鍵是要適當地處理空格字符 – srgerg 2011-03-24 00:20:47

+1

是的,這是問題,但我使用一個空間爲以下掃描和刪除\ nie scanf(「%c %d%d 「&OP,和寬度,和高度); 後來 的scanf(」 %C%d%d 「&OPB,&X,&y); 感謝大家的幫助 – Milk 2011-03-29 01:43:12

0

我認爲最簡單的將是第二個scanf函數%C之前把空間。如果你沒有空間使用它,它將需要第一個符號。這意味着換行符。空間使%c取第一個不是空格或製表符的符號。所以:

scanf(" %c %d %d", &op, &x, &y); 
+0

我不相信」 %c「忽略空格。 – 2017-02-21 01:30:36