我需要帮助解决这个问题。这是代码:
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
struct Person{
char *name[100];
char *nationality[100];
};
void put_values(struct Person *p, const char *name){
strncpy(p->name, name, 500);
}
int main(int argc, char *argv[]){
struct Person *person = malloc(sizeof(struct Person));
put_values(person, argv[1]);
free(person);
return 0;
}
以下是错误消息:
ex17t.c: In function ‘put_values’:
ex17t.c:19:3: warning: passing argument 1 of ‘strncpy’ from incompatible pointer type [enabled by default]
In file included from ex17t.c:4:0:
/usr/include/string.h:131:14: note: expected ‘char * __restrict__’ but argument is of type ‘char **’
任何帮助或提示将不胜感激。谢谢!
答案 0 :(得分:4)
您的结构应该是(没有*
个字符):
struct Person {
char name[100];
char nationality[100];
};
你拥有它的方式,name
实际上是一个包含100个字符指针而不是100个字符的数组。除非你的名字是Juan Romirez Sancho Ricardo Agusti Donatello Alfonso ... Ramundo Ronaldo Bus Stop F’tang-F’tang Ole Biscuit Barrell
,并且你希望能够独立处理每个名字,否则这可能不是你想要的。
当您尝试复制的字段只有100时,将strncpy
限制为500个字符也可能不明智: - )
答案 1 :(得分:3)
错误出现在Person
:
struct Person{
char name[100];
char nationality[100];
};
您的声明建议一个人有100个可能的名字和100个可能的国籍,必须动态分配。这不是Person
的预期用途:您似乎想要一个名称/国籍,每个都有99个字符+空终止符。
答案 2 :(得分:3)
在您的代码中,name表示包含100个char指针的数组。 但是对于strncpy,第一个参数是char的指针。 所以你应该这样做:
struct Person{
char name[100];
char nationality[100];
};
答案 3 :(得分:1)
通过定义
struct Person{
char *name[100];
char *nationality[100];
};
你有一个指向chars数组的指针。由于字符数组相当于指向一堆字符的指针,char *name[100]
相当于指向一堆字符指针的指针。如果您打算拥有多个包含100个char数组的组,那么这可能很有用,但很明显这不是您的意图。
strncpy(p->name, name, 500);
根据上面的定义,会尝试将字符串复制到指向一堆字符的指针,而不是所需的
struct Person{
char name[100];
char nationality[100];
};
strncpy(p->name, name, 500);
将字符串复制到一堆字符中。