2013-02-11 78 views
1

在下面的程序中,當從鍵盤讀取輸入時,它只取2個字符而不是4個字符,其餘2個字符默認爲空格。 爲什麼是?默認情況下在c中輸入空格

程序通過指針/

int c,inc,arrysize; 
char *revstring; 
printf("enter the size of char arry:"); 
scanf("%d",&arrysize); 
revstring = (char *)malloc(arrysize * sizeof(*revstring)); 
printf("%d",sizeof(revstring)); 
printf("enter the array elements:"); 
for(inc=0;inc<arrysize;inc++) 
{ 
scanf("%c",&revstring[inc]); 

} 
for(inc =0;inc<arrysize;inc++) 
    printf("%c",revstring[inc]); 
getch(); 
return 0; 

}

回答

3

scanf讀取格式化輸入採取炭輸入。當您錄製一個號碼時,您會錄製數字,然後按<Enter>。所以在stdin中有剩餘的\n,在接下來的scanf中讀取。如果在字符之間按<Enter>,也是如此。

一種解決方案是每個輸入後消耗的標準輸入流中的字符,如下:

#include <stdio.h> 

void 
clean_stdin (void) 
{ 
    int c; 

    while ((c = getchar()) != '\n' && c != EOF) 
    ; 
} 

另一個想法是使用fgets獲得人類輸入。 scanf不適合這種讀數。

0

大部分時間scanf讀取格式化輸入。對於大多數%格式,scanf將首先讀取並放棄任何空格,然後解析指定的項目。因此,使用scanf("%d", ...它將接受具有初始空格(甚至是額外的換行符)的輸入而不會出現任何問題。

但是,例外之一是%c。使用%c,scanf可以讀取下一個字符,不管它是什麼。如果下一個字符是空格或換行符,那就是你得到的。

取決於你想要什麼,你可以在你的格式字符串只是用一個空格:

scanf(" %c",&revstring[inc]); 

空間導致scanf跳過任何空白輸入,讓您的下一個非 - 空白字符讀取。但是,這將使它無法輸入一個帶空格的字符串(空格將被忽略)。或者,您可以在循環前執行scanf(" ");來跳過一次空白,或者scanf("%*[^\n]"); scanf("%*c");跳過所有內容直到下一個新行,然後跳過換行。