查看單個文章
  #8  
舊 2014-02-22, 01:05 AM
a40136 a40136 目前離線
進階會員
 
註冊日期: 2007-07-01
文章: 261
預設

引用:
作者: 哈啦 查看文章
以下有個習題,是要使用者打一個阿拉伯數字,然後會顯示該數字相對應的英文單字,僅限從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實有時會有意外的結果產生。
回覆時引用此篇文章