2014-09-21 50 views
-1

我知道我的標題很奇怪。我不知道怎麼說。如果我要輸入一個字符,它會循環一次,但如果我輸入一個字符,它會循環一次,但如果我再次輸入一個字符,我輸入5個字符 「你好」,它會遍歷5倍。循環迭代的次數與輸入中的字符數相同

前。 你想再次運行?(Y/N)

q

你想再次運行?(Y/N)

你好

您想再次運行嗎? (y/n)

您想再次運行嗎? (y/n)

您想再次運行嗎? (y/n)

您想再次運行嗎? (y/n)

您想再次運行嗎? (Y/N)

這是我的代碼:

char a='y'; 
    while(a=='y' || a=='Y') 
    { 
    printf("Enter a p value: \n"); 
    scanf("%d",&p); 
    printf("Enter a q value: \n"); 
    scanf(" %d",&q); 
    printf("Enter a k value: \n"); 
    scanf(" %d",&k); 

    for (i=p; i<q+1; i++) 
    { 
     Q=i; 
     sum=0; 
     count=0; 
     while(Q>0) 
     { 
     count++; 
     r = Q%10; 
     sum = sum + pow(r,k); 
     Q = Q/10; 
     } 

     if (i == sum && i>1 && count==k) 
     { 
     printf("%d\n",i); 

     } 
     i++; 
    } 
    a='z'; 
    while(a !='y' && a !='Y' && a!='n' && a!='N') 
    { 
     printf("Would you like to run again? (y/n) \n"); 
     scanf(" %c", &a); 
    } 
+1

這可能是因爲你要求一個字符。詢問整條線並檢查允許的值。並閱讀您在代碼中使用的函數的文檔。詢問時請使用最少的示例。 – 2014-09-21 18:45:49

+0

非常感謝。這工作。我剛換的scanf(「%C」,&a);到scanf函數(「%S」,&a); – 2014-09-21 18:51:17

+1

這可能更好地工作,但你寫了''的地址後面它仍然不是正確的。如果你不想關心緩衝區,'getline()'可能是您的選擇。 – 2014-09-21 18:55:20

回答

0

這是因爲,scanf的從緩衝器採取它輸入參數。對於每個有效參數
(與格式相匹配的參數),scanf會執行其作業,但如果遇到無效的參數(與格式不匹配),它將在緩衝區中保留(跳過)參數。

現在,在您的代碼中,您將「Hello」作爲輸入並使用格式說明符「%c」
因此scanf將輸入解釋爲'H','E','L','L' ,「O」,因爲您已經使用「%C」因此
它讀出由字符輸入字符和因爲所有的五個字符是有效的
字符輸入因此輸出獲取打印所有五個字符。