我正在尝试创建一个程序,它接受一定数量的字符串(要求用户输入他们将输入的字符串数),一旦它有这些字符串,它们就被放在一个数组中,使用动态记忆。
输出将是这样的:
# of Strings: 3
Cat
Dog
Elephant
Cat
Dog
Elephant
在我拥有字符串数之后,这是我的代码片段。
sptr=malloc(sizeof(char*)*nStrings);
for(i=0;i<nStrings;i++)
{
scanf("%s",string);
length=strlen(string);
sptr[i]=malloc(sizeof(char)*length);
sptr[i]=string;
}
sptr是数组,我将访问输出字符串。 所以这是一个指针数组,然后指向单个字符串(或其他字符数组,如果你更愿意这样想的话)。
让我们说有两个字符串。 我为两个指针分配内存, 然后在第一个指针,我扫描一个字符串, 我找到了弦的长度, 我分配内存大小的字符串 我等于指向字符串的指针。 这一切都很有用,如果我在最后一行之后放一个printf(),它就会起作用。 我面临的问题是,如果让我们说有3个字符串,每次通过sptr [i]被正确分配,但是在那个块之外,sptr的所有指标都是=我输入的最后一个字符串,而我不明白为什么。
如果你能帮助我,我会很感激。感谢。
答案 0 :(得分:2)
sptr=malloc(sizeof(char*)*nStrings);
for(i=0;i<nStrings;i++)
{
scanf("%s",string);
sptr[i]=strdup(string);
}
我假设变量字符串有足够的内存来保存读取字符串。
发生错误是因为您将指针设置为指向字符串变量。
答案 1 :(得分:1)
您需要为null终止符分配1个字符:
sptr[i]=malloc(sizeof(char)*(length+1));
此外,您需要将字符串复制到新分配的内存中:
strcpy(sptr[i], string);
答案 2 :(得分:1)
您的代码中存在两个问题:您没有分配足够的内存。由于字符串中的结尾\ 0,因此长度应为+ 1。其次,您应该使用strcpy将字符串复制到分配的内存中。查找处理两者的strdup函数。
答案 3 :(得分:0)
strlen不考虑零终止,需要添加一个。但主要是你需要将字符串复制到你分配的内存中。