簡體   English   中英

將字符與指針用於“單詞數組”

[英]Using character vs. pointer for an "array of words"

假設我有一個段落,我想拆分所有單詞並將它們放在一個數組中。 有什么更好的方法可以做到(在這個例子中,我們假設 100 個單詞的長度都在 20 個字符以下):

# character array
char our_array[100][20];
strcpy(our_array[0], "Hello";
strcpy(our_array[1], "Something");

或者:

# string (pointer) array
char *newer_string[100];
newer_string[0] = "Hello";
newer_string[1] = "Something";

為什么一個比另一個更可取? 在實踐中,一種比另一種更常見嗎?

版本 2 不會一次占用所有內存(就像版本 1 一樣)。 此外,您的字符串長度可以是任意的,您不受特定長度的限制(例如 20)。 在版本 2 中,您可能會獲得少量內存開銷(由於您需要保存指針),但只有在至少使用了幾乎所有單詞並且幾乎所有單詞都具有指定長度的情況下,這才是真的。

一般來說,我總是推薦版本 2(字符串/字符指針數組)。 在這個一維數組中替換字符串比在二維版本中更容易。

這取決於您想對該變量做什么。 這絕對不是一成不變的,而且幾乎沒有指導方針。

第一個選項...

char our_array[100][20];
strcpy(our_array[0], "Hello";
strcpy(our_array[1], "Something");

...的優點是our_array每個元素實際上都是一個char數組。 因此您可以修改該數據。 這些字符串不是只讀的。

另一方面,您只能使用 19 個字符的字符串,而且很容易摸索。 因為您使用strcpy()來初始化該字符串數組,所以編譯器不會檢測到您犯的任何錯誤。

另一種選擇...

char *newer_string[100];
newer_string[0] = "Hello";
newer_string[1] = "Something";

...的優點是數組的每個元素都是一個指針。 字符串保存在只讀的靜態存儲中。 它們占用的空間更少,您可以輕松更改newer_string[i]以指向其他內容。 但是,您不能修改該數據。

選項 1 將分配一個 100*20 的固定二維數組。 在這種情況下,字符串存儲在二維數組中。 這有以下特點。

  • 每個字符串的固定存儲。 例如,如果一個名稱的長度為 50 個字符,則數組必須為 100*50。
  • 數組是可變的。 即您可以輕松更改元素。
  • 不需要堆內存分配( malloc/calloc
  • 如果需要對名稱進行排序,這種方法需要將整個字符串復制過來,效率低下。

如您所見,選項 2 僅適用於編譯時的常量字符串分配。 如果要從文件或用戶讀取字符串,則需要動態分配內存。 如下圖所示。

char *newer_string[100];
char stringtemp[101];   // size this to the maximum string len you need to support.
int len;
for (i=0; i<100; i++)
{
    scanf("%s",stringtemp);
    len = strlen(stringtemp);
    newer_string[i] = malloc(len+1);
    if (newer_string[i] == NULL) { /*handle memory error*/ }
    strcpy(newer_string[i], stringtemp);
}

這里的特點是

  • 更有效的內存存儲。 例如,如果一個字符串很長,只有那個數組元素有更多的內存
  • 需要動態內存分配。 所以你也需要free照顧
  • 更容易排序。 對於排序算法,您只需要交換指針newer_string[i]newer_string[i+1]

暫無
暫無

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

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