繁体   English   中英

用getline将字符串读取到指针数组(C)

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM