#1
|
||||
|
||||
C語言的字串陣列問題
照著課本抄了一個翻譯功能的字串陣列,如下:
代碼:
#include<stdio.h> #include<string.h> char words[][2][40] = { "dog", "xiao gou", "car", "che zi", "gold", "jin zi", "child","hai zi", "wife","qi zi", "game","you xi", "house","fang zi", "rich","fa cai", "","" }; int main(void) { char english[80]; int i; printf("enter english word: \n"); gets(english); //look up the work i=0; //search while null string not yet encountered. while(strcmp(words[i][0],"")) { if(!strcmp(english,words[i][0])) { printf("chinese translation: %s", words[i][1]); break; i++; } } if(!strcmp(words[i][0],"")) printf("not in dictionary.\n"); return 0; } 結果編譯沒問題,但執行時,則發生問題,也就是只有輸入第一個English的單字 dog 會輸出答案 xiao gou,如果輸入第二個以後的任何單字,則沒有反應,只剩游標在那裡一閃一閃的,也不會自動停止程式,似乎就當在那了? 不知以上的程式是哪邊出錯? thanks. |
#2
|
|||
|
|||
代碼:
#include<stdio.h> #include<string.h> #include <iostream> using namespace std; char words[][2][40] = { "dog", "xiao gou", "car", "che zi", "gold", "jin zi", "child","hai zi", "wife","qi zi", "game","you xi", "house","fang zi", "rich","fa cai", "","" }; int main(void) { char english[80]; int i; printf("enter english word: \n"); gets(english); //look up the work i=0; //search while null string not yet encountered. while(strcmp(words[i][0],"")) { if(!strcmp(english,words[i][0])) { printf("chinese translation: %s", words[i][1]); break; } i++; } if(!strcmp(words[i][0],"")) printf("not in dictionary.\n"); return 0; } 所以i永遠會是0,會造成while不會中止,所已過一段時間程式就crash了。 |
#3
|
||||
|
||||
引用:
原本課本裡的這道範例,漏了幾個符號,其中一個就是少了},我編譯時除錯發現了,就增加一個},但沒想到還是放錯位置,應放在i++的前面。 這裡真是高手如雲,很多版友其實都深藏不露 |
#4
|
||||
|
||||
請看一下這個陣列程式:
#include <stdio.h> int main(void) { char text[][80] = { "when","in","the","course","of","human","events","",}; int i,j; //now display them. for(i=0;text[i][0];i++) { for(j=0;text[i][j];j++) printf("%c",text[i][j]); printf("\n"); } return 0; } 請問一下,為何for的迴圈條件中,這紅字部份是啥用意? 再者,中間的條件式可以用這樣的陣列嗎? thanks |
#5
|
|||
|
|||
for的第2個col是代表終止條件,只要這個arr還有值就會繼續執行下
|
#7
|
||||
|
||||
以下有個習題,是要使用者打一個阿拉伯數字,然後會顯示該數字相對應的英文單字,僅限從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 |
#8
|
|||
|
|||
引用:
書上是用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實有時會有意外的結果產生。 |
#9
|
||||
|
||||
引用:
而書上的範例則只容許0 to 9,沒有機會讓你打出10以上的數字,若打非數字則不顯示結果,但依然return 0,不會當掉。 看來我還是得再研究一下書本範例的邏輯推演,依我自己的直覺的邏輯推出來的確實有誤。十分感謝。 但拿使用者輸出去減 '0',這一點我還是搞不懂why doing so? |
#10
|
|||
|
|||
引用:
ASCII對照表如下請參考 另外要注意您宣告的interger沒特別註記的話會 signed interger 界線通常是-32767~32767,所以輸入1000000當然會當掉,是 很合理的,再來您輸入非數字卻存入int這是"非常"危險的事情,會 造成overflow,有機會會多寫入幾個byte汙染到連續記憶體區段 後面的空間(這是undefined behavior看各compiler如何處理)。 此篇文章於 2014-02-22 01:47 AM 被 a40136 編輯。 |