首頁(yè)考試吧論壇Exam8視線考試商城網(wǎng)絡(luò)課程模擬考試考友錄實(shí)用文檔求職招聘論文下載
2013中考
法律碩士
2013高考
MBA考試
2013考研
MPA考試
在職研
中科院
考研培訓(xùn) 自學(xué)考試 成人高考
四 六 級(jí)
GRE考試
攻碩英語(yǔ)
零起點(diǎn)日語(yǔ)
職稱英語(yǔ)
口譯筆譯
申碩英語(yǔ)
零起點(diǎn)韓語(yǔ)
商務(wù)英語(yǔ)
日語(yǔ)等級(jí)
GMAT考試
公共英語(yǔ)
職稱日語(yǔ)
新概念英語(yǔ)
專四專八
博思考試
零起點(diǎn)英語(yǔ)
托?荚
托業(yè)考試
零起點(diǎn)法語(yǔ)
雅思考試
成人英語(yǔ)三級(jí)
零起點(diǎn)德語(yǔ)
等級(jí)考試
華為認(rèn)證
水平考試
Java認(rèn)證
職稱計(jì)算機(jī) 微軟認(rèn)證 思科認(rèn)證 Oracle認(rèn)證 Linux認(rèn)證
公 務(wù) 員
導(dǎo)游考試
物 流 師
出版資格
單 證 員
報(bào) 關(guān) 員
外 銷 員
價(jià)格鑒證
網(wǎng)絡(luò)編輯
駕 駛 員
報(bào)檢員
法律顧問(wèn)
管理咨詢
企業(yè)培訓(xùn)
社會(huì)工作者
銀行從業(yè)
教師資格
營(yíng)養(yǎng)師
保險(xiǎn)從業(yè)
普 通 話
證券從業(yè)
跟 單 員
秘書資格
電子商務(wù)
期貨考試
國(guó)際商務(wù)
心理咨詢
營(yíng) 銷 師
司法考試
國(guó)際貨運(yùn)代理人
人力資源管理師
廣告師職業(yè)水平
衛(wèi)生資格 執(zhí)業(yè)醫(yī)師 執(zhí)業(yè)藥師 執(zhí)業(yè)護(hù)士
會(huì)計(jì)從業(yè)資格
基金從業(yè)資格
統(tǒng)計(jì)從業(yè)資格
經(jīng)濟(jì)師
精算師
統(tǒng)計(jì)師
會(huì)計(jì)職稱
法律顧問(wèn)
ACCA考試
注冊(cè)會(huì)計(jì)師
資產(chǎn)評(píng)估師
審計(jì)師考試
高級(jí)會(huì)計(jì)師
注冊(cè)稅務(wù)師
國(guó)際內(nèi)審師
理財(cái)規(guī)劃師
美國(guó)注冊(cè)會(huì)計(jì)師
一級(jí)建造師
安全工程師
設(shè)備監(jiān)理師
公路監(jiān)理師
公路造價(jià)師
二級(jí)建造師
招標(biāo)師考試
物業(yè)管理師
電氣工程師
建筑師考試
造價(jià)工程師
注冊(cè)測(cè)繪師
質(zhì)量工程師
巖土工程師
造價(jià)員考試
注冊(cè)計(jì)量師
環(huán)保工程師
化工工程師
咨詢工程師
結(jié)構(gòu)工程師
城市規(guī)劃師
材料員考試
監(jiān)理工程師
房地產(chǎn)估價(jià)
土地估價(jià)師
安全評(píng)價(jià)師
房地產(chǎn)經(jīng)紀(jì)人
投資項(xiàng)目管理師
環(huán)境影響評(píng)價(jià)師
土地登記代理人
繽紛校園 實(shí)用文檔 英語(yǔ)學(xué)習(xí) 作文大全 求職招聘 論文下載 訪談|游戲
軟件水平考試
軟件水平考試資訊
軟件水平考試試題
軟件水平考試專項(xiàng)輔導(dǎo)
軟件水平考試交流互動(dòng)
軟件水平考試交流互動(dòng)
您現(xiàn)在的位置: 考試吧 > 軟件水平考試 > 復(fù)習(xí)資料 > 程序員資料 > 正文

2012年軟考程序員輔導(dǎo):C語(yǔ)言新人常見(jiàn)問(wèn)題

 

  4、scanf格式控制誤用

  例如:

  #include

  int main(void)

  {

  float a,b,c;

  printf(“shuru 3 ge xi shu :”);

  scanf(“%f,%f,%f”,&a,&b,&c);

  printf(“he shi %f”,a + b + c);

  return 0;

  }

  解析:scanf()函數(shù)允許把普通字符放在格式字符串中。除了空格字符之外的普通字符一定要與輸入串準(zhǔn)確匹配。否則,例如上面的程序,那么scanf()將其解釋成,將鍵入一個(gè)數(shù)字,鍵入一個(gè)逗號(hào),然后再鍵入一個(gè)數(shù)字,再鍵入一個(gè)逗號(hào),最后再鍵入一個(gè)數(shù)學(xué)。也就是說(shuō)必須像這樣輸入:2.3,5.1,3.8。如果不能精確匹配,則scanf()讀取將失敗。

  作為編寫這個(gè)程序的人,你可以按照這個(gè)格式輸入,但是用戶則不知應(yīng)該以何種格式輸入。所以應(yīng)該改為scanf(“%f%f%f”,&a,&b,&c);

  解決方案:scanf一行見(jiàn)解析。

  5、scanf參數(shù)錯(cuò)誤

  例如:

  #include

  int main(void)

  {

  char str[80];

  printf(“Please enter your first name”);

  scanf(“%s”, &str);

  printf(“Hello %s”, str);

  return 0;

  }

  解析:scanf()中,讀取int, long, float, double, char等類型的數(shù)據(jù),是需要在第n(n>=2)個(gè)參數(shù)里加上&的,因?yàn)閟canf()函數(shù)里,第n(n>=2)個(gè)參數(shù)是變量的地址,而不是變量本身:例如定義int num;則scnaf(“%d”, &num);而讀取字符串是不需要加上&,因?yàn)樽址淖兞棵旧砭痛砹说刂贰K岳又袘?yīng)為scanf(“%s”, str);同時(shí),這條規(guī)則對(duì)于結(jié)構(gòu)體內(nèi)的變量的也適用,即

  struct foo {

  char ch;

  char str[80];

  int num

  }data;

  那么應(yīng)該是

  scanf(“%c%s%d”, &data.ch, data.str, &data.num);

  解決方案:見(jiàn)解析

  6、數(shù)據(jù)類型混淆

  例如:

  #include

  int main(void)

  { int a;

  double b=1;

  for(a=1;a<=6;aA++)

  b*=A;

  printf(“%ld”,b);

  }

  解析:定義b為雙精度浮點(diǎn)型,而輸出使用%ld即長(zhǎng)整型,數(shù)據(jù)類型不一致,輸出為0.PS:老譚的書講到用TC調(diào)試那一節(jié)舉的例子貌似就是int a; 后面寫到printf(“%f”,a);產(chǎn)生錯(cuò)誤的。

  解決方案:把b定義為長(zhǎng)整型long,即long b = 1;

  (其實(shí)這里還涉及到隱式轉(zhuǎn)換,所以,更為正確的方法是把a(bǔ)也定義為長(zhǎng)整型)

  7、C語(yǔ)言中的“除法”

  例如:

  #include

  int main(void)

  {

  printf(“請(qǐng)輸入一個(gè)華氏溫度\n”);

  float a,c;

  scanf(“%f”,a);

  c=5/9*(a-32);

  printf(“攝氏溫度為%4.2f”,c);

  return 0;

  }

  解析:C語(yǔ)言中,兩個(gè)整型數(shù)相除,如果不能除盡,那么小數(shù)部分會(huì)直接被丟棄,即“截尾”。因此5/9的結(jié)果是0.

  解決方案:應(yīng)該使用類型轉(zhuǎn)換,或者明確相除的兩數(shù)的類型

  (1)c=(float)5/9*(a-32);

  (2)c=5.0/9*(a-32);

  (3)c=5.0/9.0*(a-32);

  8、混合輸入數(shù)字和字符的杯具

  #include

  int main(void)

  {

  char ch;

  int num, i;

  printf(“Enter a character and a integer:\n”);

  while((ch = getchar()) != ’\n‘)

  {

  scanf(“%d”, &num);

  for(i = 0; i < num; ++i)

  putchar(ch);

  putchar(’\n’);

  printf(“Enter an another pair.Empty line to quit”);

  }

  return 0;

  }

  解析:這段程序表面看起來(lái)沒(méi)有什么問(wèn)題,但是,實(shí)際運(yùn)行一遍的,就會(huì)發(fā)現(xiàn),只輸入了一組數(shù)據(jù),程序就退出了。

  在開始的時(shí)候,程序運(yùn)行良好,例如輸入 a 2,程序就會(huì)打印出aa。但是,程序還沒(méi)響應(yīng)第二次輸入就退出了。問(wèn)題就出在換行符,這次是緊跟在第一個(gè)輸入的2后面的那個(gè)換行符。scanf()函數(shù)將該換行符留在輸入隊(duì)列中,而getchar()并不跳過(guò)換行符。所以在循環(huán)的下一個(gè)周期,getchar()讀取了第一次輸入時(shí)的換行符,而換行符正是終止循環(huán)的條件。

  解決方案:吃掉輸入流中的回車即可

  在while循環(huán)最后,加上以下語(yǔ)句

  while (getchar() != ’\n‘)

  continue;

  也可以加上fflush(stdin);刷新輸入流。

文章搜索
軟件水平考試欄目導(dǎo)航
版權(quán)聲明:如果軟件水平考試網(wǎng)所轉(zhuǎn)載內(nèi)容不慎侵犯了您的權(quán)益,請(qǐng)與我們聯(lián)系800@exam8.com,我們將會(huì)及時(shí)處理。如轉(zhuǎn)載本軟件水平考試網(wǎng)內(nèi)容,請(qǐng)注明出處。