我试图从用户获取5个字符串,并将该字符串存储到char字符串数组中,但是,当我尝试使用该程序时,程序的输出总是相同的,最后一个值是用户已经输入了......
请参阅我的代码:
#include <stdio.h>
int main()
{
int i = 0;
char *s[50];
char str[50];
for(i=0;i<5;i++)
{
fgets(str, 50, stdin);
s[i] = str;
}
for(i=0;i<5;i++)
printf("%s\n ", s[i]);
}
那么,我如何解决这个问题,如何将用户挖掘的值放入数组中,并在其他时间打印值?
答案 0 :(得分:4)
您需要使用strcpy而不是简单的赋值。
str是一个内存位置,所有s [i] = str正在执行的操作指向每次调用fgets时被覆盖的相同缓冲区。
以下内容可以满足您的需求:
#include <stdio.h>
int main()
{
int i = 0;
char s[5][50];
char str[50];
for(i=0;i<5;i++)
{
fgets(str, 50, stdin);
strcpy(s[i],str);
}
for(i=0;i<5;i++)
printf("%s\n ", s[i]);
}
答案 1 :(得分:3)
您正在使用以下行创建单个字符数组
char str[50];
然后,数组s
中的每个指针都指向同一个内存位置。每次调用fgets时,你都会覆盖存储在该内存中的字符串,因此当你打印出s
数组中的每个字符串时,你会得到同样的东西:最后一个值用户输入,存储在该单个本地分配的内存块中。
尝试为用户读入的每个字符串分配一个新内存块,然后将新内存块的指针存储在s
中:
char *str;
for(i=0;i<5;i++)
{
str = malloc(50);
fgets(str,50,stdin);
s[i] = str;
}
答案 2 :(得分:1)
s
的所有指针都指向str
。因此只存储最后一个输入。
执行:
for(i=0;i<5;i++)
{
fgets(str, 50, stdin);
s[i] = strdup(str);
}
如果strdup()不可用(POSIX函数),那么您可以实现它或使用malloc()
+ strcpy()
。
for(i=0;i<5;i++)
{
fgets(str, 50, stdin);
s[i] = malloc(strlen(str) + 1);
strcpy(s[i], str);
}
最后free {)s
中的指针:
for(i=0;i<5;i++)
{
free(s[i]);
}
答案 3 :(得分:0)
注意char *s[50]
只声明50个指针(不是指向50个字符的指针!);他们需要指出某个地方才能复制一些内容。那个2-dim char的数组怎么样:
char s[5][50];
然后用
读入它们fgets (s[i], 50, stdin);
优点:无需捣乱strost,malloc和free。