繁体   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