簡體   English   中英

C中的二維字符串數組

[英]Two dimensional string array in C

我想用C語言迭代下面的2d字符串數組; 這是迭代的代碼:

char list [][] ={{"dan","1"},{"sara","2"},{"loura","3"}};

for(i=0; i < 3;i++){

    for(j=0; j < 2;j++){

        if(strcmp(list[i][0],data)==0)
        {
            /*some code*/              
        }

    }//end column 


}// end row for

我收到很多警告,比如“數組類型有不完整的元素類型”。 我認為問題出在2d數組中。 我嘗試了其他初始化方式:

 char **list[][]=......

但那也不起作用。

你應該這樣宣布它

char list[][2][6] = {{"dan", "1"}, {"sara", "2"}, {"loura", "3"}};
  1. 它是一組字符數組的數組。 所以3D char數組。 你只有2對[]
  2. 您必須指定除第一個維度以外的所有維度 char[3][2][6]也不會有什么壞處。
  3. 最后一個大小“6”是最長字符串"loura"加上空終止char

if(strcmp(list[i][0],data)==0)

應該

if(strcmp(list[i],data)==0)

您需要字符串的地址,而不是第一個元素。

根據你的評論,數組永遠不會改變,你應該讓它保持不變。 還可以使用指向條目的指針。 后者避免了提供最大值的需要。 每個“字符串”的字符大小,避免空間縮小:

const char * const list[][2] = { { "...", "..." } , ... };

這是一個指向char的2D數組。 初始化器將設置指向初始化器中給出的字符串文字的指針。 這是您可以獲得的最舒適(在自動內存空間大小的意義上)。 編譯器可以通過初始化器中的對數推導出外(最左邊!)維。 對於內部維度,您必須指定。 字符串文字的大小與數組無關,因為我們使用指針(數據不存儲在數組本身中)。

第一個const告訴編譯器指向的對象不會被修改。 第二個對指針本身說明相同(這意味着整個數組不會被修改)。

有了這個,您可以使用您在問題中使用的strcmp

strcmp(list[i][0], data)

確保data 始終正確終止(即結尾處為'\\0' )。

更新:根據您的編輯,您希望以數字形式訪問第二個條目。 也許整數會比字符串更好。 為此,您需要一個struct一維數組:

const struct {
    const char *name;
    int number;
} list[] = { { .name = "name", .number = 15 } , ... };

.name = / .number =部分是指定的初始化者;自C99以來的標准。)

用法:

strcmp(list[i].name, data)
int my_number = list[i].number;

這樣,您可以更輕松地處理整數部分,並且可以更輕松地命名兩個條目。 即使你仍然使用兩個字符串,這可能是更好的方法,因為只有當所有條目具有相同的語義時才應該使用數組,否則struct將更合適。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM