[英]Reading strings with getline into a pointer array (C)
我想将几个字符串(名称)写入指针数组。 我写了一个代码,我认为从逻辑上讲可以做到这一点,但是由于某种原因,它只输出最后一个字符串。 对此有什么解决方案?
#include <stdio.h>
#include <stdlib.h>
#define MAX 50
int jatekosell(char* s) {
int n, ok = 1;
n = atoi(s);
if(n<3 || n > 15)
{
printf("Nem jo! 3 es 15 koze kell essen!");
getline(s, MAX);
ok = 0;
}
return ok;
}
int getline(char *s, int n);
void main() {
char amount[MAX];
char name[MAX];
char *names[MAX];
int number, i, j;
printf("Number of players between 3 and 15: ");
getline(amount, MAX);
while(!jatekosell(amount));
number = atoi(amount);
for(i = 0; i < number; i++)
{
printf("Type the %d. name: ", i+1);
getline(name, MAX);
names[i] = name;
}
for(i = 0; i < number; i++)
{
printf("The names: %s\n", names[i]);
}
getchar();
}
int getline(char *s, int n){
int c;
char *t=s;
while(n-- > 0 && (c=getchar())!=EOF&&c!='\n') *t++ = c;
*t='\0';
while(c!=EOF&&c!='\n') c=getchar();
return(t-s);
}
您将相同的存储位置( name
变量)存储在每个names
数组项中。 您可以通过在打印时将%s
更改为%p
来看到(以显示name[i]
的内存地址)。
您不仅需要分配names[i] = name
,还需要将name
的内容复制到names[i]
。
您已声明将数据插入getline()
的单个缓冲区,即char name[MAX];
。
您在其中读取数据,然后使用names[i] = name;
“将其放入数组” names[i] = name;
。
问题是数组中的每个元素都指向相同的单个缓冲区,而每个后续的getline()
只会覆盖该缓冲区的内容。
您可以通过替换names[i] = name;
来解决此问题names[i] = name;
与names[i] = strdup(name);
strdup()
函数将字符串复制到动态分配的缓冲区中。 请注意,尽管您现在有责任在不再需要该缓冲区时(通过free()
)来释放该缓冲区。
另一个解决方案是替换char *names[MAX];
char names[MAX][MAX];
(以预分配所有缓冲区)和strcpy()
到下一个位置,但这可能会浪费大量内存。
这条线
names[i] = name;
是错的。 您需要使用memcpy或每次都覆盖最后一个字符串。 您还需要为接收的字符串分配空间,即MAX == 10;
char *names[10];
正在分配一个由10个指向字符串的指针组成的数组,即分配时没有空间容纳字符串。
char names[10][MAX];
这为您提供了一个指针数组,每个指针可以容纳MAX个字符。 或者您需要在使用之前先分配它们,即
names[i] = calloc(1, MAX);
size_t name_len = strlen(name);
assert(name_len < MAX);
memcpy(names[i], name, name_len);
names[i][str_len] = '\0';// Null terminate string
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.