2012-10-07 69 views
2

所以我剛開始學習C一類我的,我一直在做這個任務,但是這部分有我茫然不知所措。我有一些代碼,基本上是這樣的:此掃描結果爲何無限循環?

#include <stdio.h> 
#include <string.h> 

int main(void) 
{ 
    int one = 0; 
    int two = 0; 
    char oneWord[100]; 
    char twoWord[100]; 

    printf("Enter a two digit number: "); 
    scanf("%d%d", &one, &two); 

    strcpy(firstWord, "Test"); 
    strcpy(secondWord, "Two"); 

    printf("%s", firstWord); 

    return 0; 
} 

現在,程序預留的邏輯/目的,我想不通就是爲什麼scanf函數語句導致一個無限循環?我確定這是導致問題的原因,當我評論它並且最後的printf聲明工作得很好。

我試圖將其更改爲scanf("%d,%d", %one, %two)而且似乎當我添加了一個逗號輸入做工精細。但我希望能夠像55這樣的數字並將其分成2位數。我在這裏做錯了什麼?

+0

變化'%D'到' %s' – janisz

+0

@janisz - 爲什麼? – MByD

+0

對不起,我沒有讀完整個故事。將'%d'更改爲'%c'只能讀取一個字符 – janisz

回答

7

你遇到的不是一個無限循環,而是scanf等待更多的輸入。

d -format-specifier表示一個十進制數,所以類似「0」,「41」或「2342345」。

您輸入的第一個號碼,你預期程序繼續後,但scanf剛剛完成第一%d,所以scanf正等着你來完成第二%d。這似乎是一個無限循環,但真的是scanf做你命令它。

scanf無法猜測有多少位爲每個你的願望號碼。但你可以告訴它你怎麼想的那樣,具有寬度說明符,告訴每一個信息是多少個字符組成的:

#include <stdio.h> 

int main() { 
    int a, b; 
    scanf("%2d%1d", &a, &b); 
    printf("%d, %d", a, b); 
} 

錯誤處理:

#include <stdio.h> 

int main() { 
    int a, b; 
    if (scanf("%2d%1d", &a, &b) < 2) 
     fprintf(stderr, "not enough digits"); 
    else 
     printf("%d, %d", a, b); 
} 
+3

也告訴他,這不是無限循環。相反,它只是等待輸入一個數字。 –

+1

@NirajNawanit:非常好,謝謝。 –

+0

啊人,沒想到這麼快答案這麼快!但是我最終做的是'scanf(「%1d%1d」,&1,&2)',這樣做有什麼問題,而不是你的解決方案'scanf(「%2d%1d」,&one,&two) '? –

2

我可能是錯的,但%d的意思是「整數」,而不是「一個數字」。所以55是第一個%d,那麼第二個沒有定義。

您可以用%c(一個字符)嘗試。

+1

你可能是對的。請參閱[this](http://www.cplusplus.com/reference/clibrary/cstdio/scanf/)以供參考,但並未完全回答他的問題。 –

+1

也告訴他,這不是無限循環。相反,它只是等待輸入一個數字。 –

+1

更準確地說,「d」是「十進制」,即「十進制數」,換句話說,是一個基數爲10的數字。 –

1
printf("Enter a two digit number: "); 
scanf("%1d%1d", &one, &two); 

當然,即使這可能會失敗(不符合要求)
相反:

scanf("%d", &one); 
if (one<10 || one>99) printf("I didn't expect that...\n"); 

scanf("%s",oneWord); one = atoi(oneWord); 
if (one<10 || one>99) 
    printf("Thats not necessarily even a number\n"); 
else 
    { two = one % 10; one = one/10; 
     printf("The first digit is %d and the second is %d\n",one,two); 
    } 

在我們測試後的程序輸入是正確的:
這是一個很好的做法,養活垃圾,而不是正確的輸入,並看到,它悄無聲息。庫函數atoi(string);返回一個字符串中包含的整數。如果沒有找到整數,則爲零。例如(atoi(「a1」)== 0)。

但最低正確的答案應該是

scanf("%d", number); 
if (number >= 10 && number <= 99) 
{ 
    one = number/10; // the first digit; 
    two = number % 10; // the second digit calculated as number modulo 10 
} 

scanf("%1d%d", &one, &two); // would halt for a single character input 
+1

如果'one'是單個小數(如「d」)數字,那麼它怎麼會比9大?並且錯誤檢查本身不確定它所做的是不是有效的錯誤檢查。 –

+1

嘗試第一個例子並輸入例如123;這不是一個兩位數字。 –

+0

我錯過了在第二個格式字符串中不使用寬度說明符(與第一個格式字符串不同)。但是,它不能解決提問者將數字字符串解析爲若干數字的問題。另外:你的第二個例子對於手頭的問題有點過分。也許至少要解釋你在那裏做什麼? –