我已经尝试了一段时间但我无法处理指针数组 例如
char *word;
char *container[100];
在下面的for循环中,我将字符串中的单个字符附加到temp,然后如果出现分隔符。,我想添加到* container [100]。
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
int main()
{
int z = 0;
int k=0;
char *word;
char *container[100];
char *in = " First Word . Second Word";
for(k=0; k<strlen(in); k++)
{
//using . as a delimiter
if(in[k]=='.')
{
container[z] = word;
printf("%s\n", container[z]); //<---- this prints okey inside loop
z++;
memset(word,0,strlen(word));
}
else
{
//appending characters to temp, using some method
snprintf(word + strlen(word), (sizeof word) - strlen(word), "%c", in[k]);
}
}
//doesnt print anything outside the loop
printf("Does it print: %s\n", container[0]);
printf("Doest it print: %s\n", container[1]);
return 0;
}
当我尝试在容器中打印单词时,它不会显示任何内容:
printf("%s\n", container[0]);
printf("%s\n", container[1]);
我想我必须做一些动态分配。但我不知道如何。
答案 0 :(得分:1)
在开始使用之前,指针word
未初始化。这会导致未定义的行为。如果您很幸运,您会遇到分段错误,因此您可以了解问题并进行修复。如果你运气不好有点可行,但会产生奇怪的副作用,比如神秘地覆盖其他变量。
此外,sizeof word
返回指针大小,而不是它指向的(已分配)内存区域的大小。
word
的问题可以通过将其设为数组来解决:
char word[100];
现在word
包含100个字节的内存,我们可以安全地写入,sizeof word
将评估为100
。
下一个问题是指定container
指针指向word
。这将不复制word
中包含的字符串。稍后当您覆盖单词的内容时,container[i]
的内容也将被覆盖,因为它将指向同一个内存位置。您可以使用strdup
创建动态分配的副本:
container[z] = strdup(word);
注意:strdup()
是POSIX函数,不是C规范的一部分。在没有strdup()
的平台上,您可以使用malloc
+ strcpy
执行相同的任务。