gpt4 book ai didi

在C中创建动态大小的二维数组

转载 作者:行者123 更新时间:2023-11-30 19:03:58 25 4
gpt4 key购买 nike

假设我们有一串由逗号分隔的单词。我想用 C 语言编写一段代码,将这些单词存储在变量中。

示例


亚马逊、谷歌、 Facebook 、推特、Salesforce、SFB

我们不知道有多少单词。

如果我要在 C 中执行此操作,我认为我需要进行 2 次迭代。第一次迭代,我计算存在的单词数量。然后,在下一次迭代中,我存储每个单词。

Step 1: 1st loop -- count number of words
....
....
//End 1st loop. num_words is set.

Step 2:
// Do malloc using num_words.
char **array = (char**)malloc(num_words* sizeof(char*));

Step 3: 2nd loop -- Store each word.
// First, walk until the delimiter and determine the length of the word
// Once len_word is determined, do malloc
*array= (char*)malloc(len_word * sizeof(char));
// And then store the word to it

// Do this for all words and then the 2nd loop terminates

这可以更有效地完成吗?我不喜欢有两个循环。我认为必须有一种方法可以仅使用基本指针在 1 个循环中完成此操作。

唯一的限制是这需要在 C 中完成(由于不受我控制的限制)

最佳答案

您不需要单独进行一次计算单词数。当您单次读取数据时,您可以使用realloc动态扩大数组。

要解析输入行缓冲区,您可以使用 strtok 来标记各个单词。

将解析后的单词保存到单词列表数组中时,可以使用 strdup 创建标记化单词的副本。这对于这个词的持续存在是必要的。也就是说,当您读取第二行时,您在第一行的行缓冲区中指向的任何内容都会被破坏(依此类推...)

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

char **words;
size_t wordmax;
size_t wordcount;

int
main(int argc,char **argv)
{
char *cp;
char *bp;
FILE *fi;
char buf[5000];

--argc;
++argv;

// get input file name
cp = *argv;
if (cp == NULL) {
printf("no file specified\n");
exit(1);
}

// open input file
fi = fopen(cp,"r");
if (fi == NULL) {
printf("unable to open file '%s' -- %s\n",cp,strerror(errno));
exit(1);
}

while (1) {
// read in next line -- bug out if EOF
cp = fgets(buf,sizeof(buf),fi);
if (cp == NULL)
break;

bp = buf;
while (1) {
// tokenize the word
cp = strtok(bp," \t,\n");
if (cp == NULL)
break;
bp = NULL;

// expand the space allocated for the word list [if necessary]
if (wordcount >= wordmax) {
// this is an expensive operation so don't do it too often
wordmax += 100;

words = realloc(words,(wordmax + 1) * sizeof(char *));
if (words == NULL) {
printf("out of memory\n");
exit(1);
}
}

// get a persistent copy of the word text
cp = strdup(cp);
if (cp == NULL) {
printf("out of memory\n");
exit(1);
}

// save the word into the word array
words[wordcount++] = cp;
}
}

// close the input file
fclose(fi);

// add a null terminator
words[wordcount] = NULL;

// trim the array to exactly what we need/used
words = realloc(words,(wordcount + 1) * sizeof(char *));

// NOTE: because we added the terminator, _either_ of these loops will
// print the word list
#if 1
for (size_t idx = 0; idx < wordcount; ++idx)
printf("%s\n",words[idx]);
#else
for (char **word = words; *word != NULL; ++word)
printf("%s\n",*word);
#endif

return 0;
}

关于在C中创建动态大小的二维数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53242449/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com