0

我有一个字符串,我需要将其传递给如下函数。

scanf("%s%d",&name,&telno);
addatend(telno,name);

在哪里

char name[MAX];

我收到以下警告:

warning: format ‘%s’ expects argument of type ‘char *’, but argument 2 has type ‘char (*)[50]’ [-Wformat]

我确实尝试过做一些改变,比如多了一个char指针并指向name. 但是警告仍然存在。

在函数中我有 strcpy

strcpy(addnode->name,name1);

这是结构中的name从头到尾。但是这条线存在分段错误。mainnameaddnode

我尝试检查夹板(此行没有任何问题)和 valgrind,但无法识别我的错误。因此来这里寻求帮助。提前致谢..

编码:

typedef struct Mystruct{
char *name;
int telno;
struct Mystruct *nextp;
}data;

void addatend(int telno1, char* name1)
{
    data *addnode, *previousnode;
    addnode = malloc (sizeof(data));

    if(addnode == NULL)
    {
        printf("Memory allocation failed...Exiting");
        exit(0);
    }

    strcpy(addnode->name,name1);        //error Part of the code.
4

2 回答 2

3

使用 读取字符串时scanf,数组作为指针传递给函数,因此您不需要地址操作符&


关于您的第二个问题...您还需要为复制到的目标分配内存。malloc在 之前再次使用(使用strlen(...) + 1+1作为字符串终止符) ,或者strcpy使用strdupwhich 分配和复制字符串:

addnode->name = strdup(name1);
于 2012-12-10T10:25:14.690 回答
2

您还可以使用零长度数组或灵活数组成员将名称存储在结构中。但是,它必须是最后一个结构成员。这是您声明它的方式。

typedef struct Mystruct {
    int telno;
    struct Mystruct *nextp;
    char name[];
} data;

在函数中,你会做

data *addnode = malloc(sizeof(data) + strlen(name1) + 1);
strcpy(addnode->name, name1);
于 2012-12-10T12:52:50.870 回答