2017-03-16 42 views
-4

我被要求在我的大學做一份海鮮菜單作爲一項任務。我會在這裏提供的相關代碼:%c與%s的實際區別

int main() 
{ 
int a,d; 
float c ; 
char b,s,S,m,M,l,L; 

printf ("\n\t\t\t\tSeafood Menu\n"); 
printf ("----------------------------------------------------------------------------------\n"); 
printf ("\t\t\t\t\t\t  Dish Size\n"); 
printf ("Item Number\t Seafood Dish\t  Small\t  Medium  Large\t\n"); 
printf ("----------------------------------------------------------------------------------\n"); 
printf ("\t 1\t Fried \t20.00 \t\t 40.00 \t\t 55.00\n"); 
    //Continue with a bunch of menu here 

    printf (" Enter item number   :"); 
    scanf ("%d",&a); 
    printf (" Enter dish size (S/M/L) :"); 
    scanf ("%s",&b); 


     if ((a==1)&&((b=='s')||(b=='S'))) 
     {c=20.00;} 
     //continue with a bunch of condition to choose the price per dish stated in the menu 


    printf (" Enter dish quantity  :"); 
    scanf ("%d",&d); 
    printf (" Price per dish size  :RM%.2f\n\n\n",c); 


return 0;  
} 

當我試圖在這個轉換格式標識符%C,它只是停止接受輸入特定scanf函數。

printf ("Enter dish size (S/M/L):"); 
scanf ("%s",b); 

我想附圖像,但似乎不允許我這樣做想留兩個鏈接:

Normal, using %s:abnormal, using %c

我很好奇,爲什麼它不「當我使用%c時工作,而%s工作?我所進入的只有性格。請賜教。

+4

這兩種變體都會調用未定義的行爲。請閱讀'scanf'的文檔以及一個字符和一系列字符的區別_。一個C字符串。 – Olaf

+0

在您方便的C參考手冊中應明確說明'%c'和'%s'的行爲。如果您沒有方便的C參考手冊,我推薦Harbison&Steele的[C:A參考手冊](http://careferencemanual.com)。 '%c'從輸入流中讀取* single *字符並將其存儲到單個'char'對象。 '%s'從輸入流中讀取字符值的*序列*,直到它看到空格或EOF並將它們存儲到char的*數組*中作爲0結尾的字符串。 –

回答

1

我很好奇它爲什麼在%s工作時使用%c時不起作用?

那麼,猜猜看,它沒有工作,即使它似乎。

如在手冊頁提到的,對於scanf(),參數的類型是

  • %c需要一個指向char
  • %s期望的指針char數組的初始元件。

引用C11,章§7.21.6.2,(重點煤礦

c精確匹配,如果沒有字段寬度由場 寬度(1指定的數字的字符序列存在於指令中)

如果沒有l長度改性劑的存在,則相應的參數應該是一個 指針的字符陣列足夠大,以接受 序列的初始元件。不添加空字符。

s匹配一系列非空白字符。

如果沒有l長度改性劑的存在,則相應的參數應該是一個 指針的字符陣列足夠大,以接受 序列的初始元件和終止空字符,這將被自動添加。

在你的情況,

  • 提供%s是錯誤的,作爲一個單一的char是一個元件太短掃描並保存數組,即空終止。這會導致undefined behavior發生內存溢出。

  • %c應該有「工作」,如果輸入流沒有從以前的ENTER按鍵存儲newline。如果清除所有未決輸入的輸入流,則會看到它的工作原理。使用類似

    scanf(" %c", &b); //the whitespace "eats up" all the previous whitespaces 
    

    你可以看到我的this previous answer,對相同的細節。

+2

「指向'char'數組的指針是誤導性的,因爲'%s'仍然指向'char'的指針,而不是指向'char'數組的指針。我的系統上的手冊頁說,「指向字符數組的初始元素的指針」 – Dmitri

+0

@Dmitri花了我的時間來添加相關的引號,希望這不是更具誤導性。謝謝。 :) –

+0

@SouravGhosh謝謝你的解釋。這幫助我解決了我的問題。 –

相關問題