2016-03-17 61 views
0

我想将几个字符串(名称)写入指针数组。我写了一个代码,我想逻辑上会这样做,但由于某种原因,它只打印最后一个字符串。有什么可以解决这个问题的?使用getline将字符串读入指针数组(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); 
} 
+0

已经有一个'getline'函数是标准库的一部分。你应该为你的函数真的使用另一个名字(比如'getln')? –

+0

当它确实看起来非常像'fgets(,, stdin)''时,是否有理由甚至使用该getline? –

+0

另外['int main()'](http://stackoverflow.com/questions/204476/what-should-main-return-in-c-and-c),对我来说这看起来像你不编译随着警报的启用... –

回答

0

您已将单个缓冲区声明为getline()将您的数据转换为char name[MAX];

您读取那里的数据,然后“”将其放入阵列中。

问题是数组中的每个元素指向同一个单独的缓冲区,并且每个连续的getline()只是覆盖该缓冲区的内容。

您可以通过将names[i] = name;替换为names[i] = strdup(name);来解决此问题strdup()函数将字符串复制到动态分配的缓冲区中。请注意,当您不再需要时,您现在负责释放该缓冲区(通过free())。

另一种解决方案是将char *names[MAX];char names[MAX][MAX];(预先分配所有缓冲区)和strcpy()替换到下一个位置,但这可能会浪费内存。

0

要存储在同一存储器位置(name变量)到每个names阵列项目。打印时可以看到%s更改为%p(显示内存地址name[i])。

除了仅指定names[i] = name,您需要将name的内容复制到names[i]

0

此行

names[i] = name; 

是错误的。您需要使用memcpy,或者每次只覆盖最后一个字符串。您还需要为正在接收的字符串分配空间,例如MAX == 10;

char *names[10]; 

正在为字符串分配一个10个指针的数组,即分配时没有字符串空间。

char names[10][MAX]; 

这给你一个指针数组,它们可以分别保存MAX个字符。或者你需要malloc他们使用前,即

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 
+0

如何使用memcpy? memcpy(&names [i],name,sizeof(names)/ sizeof(names [0])); 这似乎并不奏效。 –