c - 具有字符串和输入的结构

标签 c string input structure

我有以下结构和向结构中添加内容的函数:

struct scoreentry_node {
    struct scoreentry_node *next;
    int score;
    char* name;    
}
;

typedef struct scoreentry_node *score_entry;

score_entry add(int in, char* n, score_entry en) {      
   score_entry r = malloc(sizeof(struct scoreentry_node));
   r->score = in;
   r->name = n;
   r->next = en;  
   return r;   
}

我在以下主文件中输入了它:

int score;
char name[];

int main(void) {
score_entry readin = NULL;

while(1)
{

        scanf("%s%d", name, &score);
        readin = add(score, name, readin);
       // blah blah

我不知道为什么,但是当输入一个名字时,它会被添加到 readin 中,但是当我输入另一个名字时,readin 中的所有名字都有这个新名字

例如:

input:
bob 10 
readin = 10 bob NULL

jill 20
readin = 20 jill 10 jill NULL

我不知道为什么 bob 消失了……有什么原因吗?

最佳答案

您只是存储了一个指向名称字符串的指针,而不是字符串本身的副本。尝试使用 strdup:

r->name = strdup(n);

释放节点时一定要free(r->name)

另一种方法是将 char* name 更改为 char name[1],然后执行如下操作:

score_entry add(int in, char* n, score_entry en) {      
   score_entry r = malloc(sizeof(struct scoreentry_node) + strlen(n));
   r->score = in;
   strcpy(r->name, n);

   [..]

这节省了为字符串分配单独的内存块,但请注意,在这种情况下,name 必须位于结构的末尾。

关于c - 具有字符串和输入的结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9916976/

相关文章:

c - 使用vsnprintf时有没有办法绕过va_copy?

c - 从C/C++程序执行二进制(INTEL FSP)文件的最简单方法

MySQL严格字符串比较语义上正确的方法?

C 编程 - 调用 fgets() 两次?

c# - Unity C# : Caching keyboard/controller state?

java - 循环直到按下某个键 Java

c - 在 C 中从堆栈中复制数据

c - 如何使用 ncurses 获得明亮的白色背景颜色?

localdb的sqlserver的Java连接字符串

C:连接字符串的最佳和最快方法是什么