【问题标题】:Structures with strings and input带有字符串和输入的结构
【发布时间】:2012-03-28 23:10:24
【问题描述】:

我有以下结构和功能,可以在结构中添加东西:

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 会消失……有什么原因吗?

【问题讨论】:

    标签: c string input structure


    【解决方案1】:

    您只是存储一个指向名称字符串的指针,而不是字符串本身的副本。尝试使用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 必须位于结构的末尾。

    【讨论】:

    • 我正在将结构中的char* name 更改为char name[1] 我在我的函数中遇到编译器错误添加`从类型'char *'分配给类型'char [1]'时不兼容的类型` ... 我究竟会在哪里添加 'strlen(name)' ?
    猜你喜欢
    • 1970-01-01
    • 2017-06-25
    • 2015-07-09
    • 2020-09-23
    • 1970-01-01
    • 2020-02-17
    • 2018-08-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多