Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/apache/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 数组";指针;关于价值的书写?_C - Fatal编程技术网

C 数组";指针;关于价值的书写?

C 数组";指针;关于价值的书写?,c,C,我试图从用户那里获取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] =

我试图从用户那里获取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]);
}
#包括
int main()
{
int i=0;
char*s[50];
char-str[50];

对于(i=0;i您需要使用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]);
}
#包括
int main()
{
int i=0;
chars[5][50];
char-str[50];

for(i=0;i所有
s
的指针都指向
str
。因此只存储最后一个输入

做:

最后释放()
s
中的指针:

  for(i=0;i<5;i++)
    {  
     free(s[i]);
    }
char *str;
for(i=0;i<5;i++)
{
  str = malloc(50);
  fgets(str,50,stdin);
  s[i] = str;
}

for(i=0;i您正在使用以下行创建单个字符数组

char str[50];
然后数组
s
中的每个指针都指向同一个内存位置。每次调用fgets时,都会覆盖存储在该内存中的字符串,因此当您打印出
s
数组中的每个字符串时,都会得到相同的结果:用户输入的最后一个值,即store在单个本地分配的内存块中

尝试为从用户处读入的每个字符串分配一个新内存块,然后将新内存块的指针存储在
s

  for(i=0;i<5;i++)
    {  
     free(s[i]);
    }
char *str;
for(i=0;i<5;i++)
{
  str = malloc(50);
  fgets(str,50,stdin);
  s[i] = str;
}
char*str;

对于(i=0;i请注意,
char*s[50]
仅声明50个指针(而不是指向50个字符的指针!);它们需要指向某个位置,然后才能将某些内容复制到它们。二维字符数组如何:

char s[5][50];
然后读到他们与

fgets (s[i], 50, stdin);

优点:不需要弄乱strdup、malloc和free。

使用strcpy(s[i],str)而不是s[i]=用参数
s
str
串strcpy是不正确的;您不想将一组字符复制到指针数组中。@Christopherbles:您不能使用
strcpy()
除非有空间可以复制到……而您没有确保提供了这样的空间。此时
str
strcpy
对您没有好处;您不妨
fgets(s[i],50,stdin)
。您好,很抱歉耽搁了:X…所以,有办法做到这一点,而不是使用strdup、strcopy或malloc???没有。如果您想动态分配字符串,没有其他方法。但是,您可以简单地声明一个静态数组。请参阅此处: