2014-02-22, 01:05 AM
|
|
引用:
作者: 哈啦
以下有個習題,是要使用者打一個阿拉伯數字,然後會顯示該數字相對應的英文單字,僅限從0到9而已。
我自己先寫了一個如下:
代碼:
#include <stdio.h>
int main(void)
{
int x;
char digits[][10]={
"zero","one","two","three","four","five","six","seven","eight","nine"};
printf("enter a number: \n");
scanf("%d",&x);
printf("%s", digits[x]);
return 0;
}
而書上的解答則是如下:
代碼:
#include <stdio.h>
#include <conio.h>
int main(void)
{
char digits[10][10] = {
"zero","one","two","three","four","five","six","seven","eight","nine"};
char num;
printf("enter a number: ");
num=getche();
printf("\n");
num=num-'0';
if(num>=0 && num<10) printf("%s",digits[num]);
return 0;
}
就運作來看,二者都正常,且獲得同樣的結果。但由於我的方式和解答有很大不同,不知各位先進能否幫我看看,我的寫法是否有什麼看不見的漏洞?
而且書上提示說:只要將使用者輸入的數字字元減掉字元'0',便可獲得相對應的索引值,這是什麼意思?
還有,前一題中的字串陣列中char text[][80] = {
"when","in","the","course","of","human","events", "",}; 為何要在最後加一個" " ?這有何用意嗎?
thanks
|
哈大:
書上是用getchar以及char去存使用者Input,是用ASCII去存,所以拿使用者輸出去減 '0' (注意這裡是指字元而非整數),就會取得差也就會是轉成整數了。
您的寫法要注意一點是您無法預估使用者會不會搗蛋,輸入超過臨界<1 >10的值而導致程式產生不可預期的狀態,範例就有輸入num做檢驗(num>=0 && num<10),這方面是比較好的做法,"永遠"不要相信使用者的輸入。
最後您所提到的方法我很少使用,我猜是各種Compiler針對arr的空控制條件不同,為使得不要產生undefined的狀況,所以故意弄一個"",確保最後一定是空值。
C/C++存在許多undefined的條件(像是除0、Out of bound),使用g++、GCC編譯加入 -O-、-O2實有時會有意外的結果產生。
|