iT邦幫忙

0

陣列收尋問題 [使用C語言]

  • 分享至 

  • xImage

各位大大,請求幫忙。
題目是:使用陣列收尋,查輸入n是否與a[]相同,如相同印出相對印位置的數字。
我的問題在:我查找到a[0],卻無法正確顯示b[0]的值?
是我哪裡有寫錯嗎?

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void main(void) {
     char *a[3] = {"大雄","宜靜","技安"};
     char *b[3] = {"093656","078885","065275"};
     char n[] = "";
     int i;

     while(1) {
          puts("enter name:");
          scanf ("%s", &n);
          for (i = 0; i < 3; i++) {
               if(strcmp(n,a[i]) == 0) {printf ("%s\n", b[i]); break;}
          }
          if (i == 3) printf ("查無此人\n");
     }
}

我得到的結果 ↓ 只有b[0]大雄會不正常結束
https://ithelp.ithome.com.tw/upload/images/20210618/20138608zlIC7TBo2c.jpg

備註:
我發現將這句的內文修改一下就能正常執行但並不是我要的結果↓
if(strcmp(n,a[i]) == 0) {printf ("%s\n", b[i]);}
將b[i]改成a[i] ---> 可正常執行,並印出"大雄"
將%s改成%p ---> 也能正常執行,並印出"位址"

如將內文修改一下,也能正常執行 ↓

char *a[3] = {"大雄","宜靜","技安"};
int b[3] = {"93656","78885","65275"};

→但大雄出來的結果還是怪怪的,不是93656是11515498,且b[0]的初始值怎麼改都不會變

而將內文修改一下,忽略掉[0]這個索引就能正常執行 ↓

char *a[4] = {"","大雄","宜靜","技安"};
char *b[4] = {"","093656","078885","065275"};

→但這樣本質問題依然沒有解決

另外在a[0]放上1個字元,b[0]跑出來的結果有時會出現 [字元q 、 亂碼 、 直接結束]

char *a[4] = {"q","大雄","宜靜","技安"};
char *b[4] = {"0900","093656","078885","065275"};

==回覆.海綿寶寶==
可以用!! 謝謝大神幫忙解惑。 (新手訓練期無法使用回應)

但為什麼一維陣列不能?? 是因為儲存空間的關係??
字串是由字元所構成的,所以要由二維陣列建立一個空間及每個字的長度位置。
但我使用了字元指標,系統應該會建立一個空間儲存該字串。

剛測試了一下,好像跟要輸入的空字串有關係,是因為沒有設定空間大小,造成系統預設值的空間不足,而產生不正常結束?

char n[] = "";

但令人好奇的是,為什麼就只有b[0]有問題,b[1]~b[n]都沒問題...
又是一個要細細思考的問題了 ! " !

圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 個回答

1
海綿寶寶
iT邦大神 1 級 ‧ 2021-06-18 19:13:21
最佳解答

https://ithelp.ithome.com.tw/upload/images/20210618/200017875XzsUs3T4o.png

以下提供參考
看看可不可用

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAX_LENGTH 100

void main(void) {
     char a[3][MAX_LENGTH] = {"大雄","宜靜","技安"};
     char b[3][MAX_LENGTH] = {"093656","078885","065275"};
     char n[MAX_LENGTH] = "";
     int i;

     while(1) {
          puts("enter name:");
          scanf ("%s", &n);
          for (i = 0; i < 3; i++) {
               if(strcmp(n,a[i]) == 0) {printf ("%s\n", b[i]); break;}
          }
          if (i == 3) printf ("查無此人\n");
     }
}

你的「一維陣列」叫「字元」陣列
最多只能放一個字串
這篇裡面所說

而不管是「字元」陣列或「字串」陣列
都要註明「陣列大小」讓程式知道要「保留多少記憶體空間」
char n[]="";的寫法
編譯時不會出錯
但在執行時(scanf)你不知道會寫到那一段的記憶體
通常會造成「莫名其妙」(只有b[0]才會錯)的錯誤

spider iT邦新手 5 級 ‧ 2021-06-21 12:43:29 檢舉

了解!!謝謝大神講解。

我要發表回答

立即登入回答