2013-09-28 69 views
1

我的程序從輸入掃描並打印所有使用的大寫字母。爲什麼我的scanf輸入不正確?

我試圖在我的程序結尾處打印來自stdin的原始輸入。

但是,當我使用printf,它似乎跳過輸入表達式的第一部分,在我的字符數組中打印剩餘的東西。請幫我看看問題出在哪裏。 - 代碼註釋 -

#include <stdio.h> 

int main(void){ 

char input[81]; 
int letters[91]; 
int i; 

    //initialize arrays input and letters 
for (i = 0; i < 90; i++) letters[i] = 2; 
for (i = 0 ; i < 80; i++) input[i] = 'a'; 
i = 0; 

    //reads into input array until EOF 
while((scanf("%c",input)!= EOF)){ 

    //checks input for characters A-Z 
    if((input[i]>= 'A' && input[i]<= 'Z')) 


     letters[input[i]] = 1; 
    } 

    //prints capital letters from input that occur at least once 
for(i = 'A'; i < 'Z'; i++){ 
    if (letters[i]==1) 
    printf("%c", i);}  // this output works fine, the scan worked?? 


//print blank line 
printf("\n\n"); 


// print input 
printf("%s\n", input);  //This is where the incorrect output comes from. 

return 0;} 

我的原始輸入更改了嗎?爲什麼? 是否我的輸入無法正確掃描? 請迅速回復!

回答

1

scanf循環一次只讀取一個字符,並將其中一個字符存儲在input[0]中。當scanf循環完成時,input[0]包含讀取的最後一個字符,並且input的其餘部分未被觸及。

要修復,您需要在scanf循環的末尾包含i++

順便說,這將是更清晰的(和更有效)與到fgets單個呼叫,則通過與輸入緩衝器循環來填充輸入緩衝器:for (i=0; buf[i]!='\0'; i++) { ... }

3

這裏:

while((scanf("%c",input)!= EOF)){ 

你只會讀到input[0]的字符。這對您爲letters所做的工作很好,但顯然當您嘗試打印出input時,它不會按照您的預期工作。

當您修復它時,您還需要記住在最後一個輸入字符後添加終止的\0

1

你必須做

while((scanf("%c",&input[i])!= EOF)) 
{i++;} 

,而不是這個

while((scanf("%c",&input)!= EOF)) 
{} 

你在做的就是掃描字符轉換成int數組每次第一個元素的地址,因此它被再次改寫和再次。輸入[]數組的剩餘部分沒有被訪問,因此不會改變

+1

它必須是'&input [i]','scanf()'需要一個地址。 –

+0

感謝您的編輯。我輸錯了它。 – nkskalyan

相關問題