3

我需要帮助解决这个问题。这是代码:

#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 **’

任何帮助或提示将不胜感激。谢谢!

4

4 回答 4

5

你的结构应该是(没有*字符):

struct Person {
    char name[100];
    char nationality[100];
};

您拥有它的方式实际上是一个由 100 个字符指针name组成的数组,而不是 100 个字符。除非您的名字是并且您希望能够独立处理每个名字,否则这可能不是您所追求的。Juan Romirez Sancho Ricardo Agusti Donatello Alfonso ... Ramundo Ronaldo Bus Stop F’tang-F’tang Ole Biscuit Barrell

strncpy当您尝试复制到的字段只有 100 个时,将您限制为 500 个字符也可能是不明智的:-)

于 2013-07-03T03:01:54.723 回答
3

在您的代码中,name 表示 100 个字符指针的数组。但是对于 strncpy,第一个参数是 char 的指针。所以你应该这样做:

struct Person{
    char name[100];
    char nationality[100];
};
于 2013-07-03T03:23:56.393 回答
3

错误在声明中Person

struct Person{
    char name[100];
    char nationality[100];
};

您的声明建议一个人有 100 个可能的姓名和 100 个可能的国籍,必须动态分配。这不是 : 的预期用途Person:您似乎想要一个单一的姓名/国籍,每个都有 99 个字符 + 空终止符。

于 2013-07-03T03:02:28.647 回答
1

通过定义

struct Person{
    char *name[100];
    char *nationality[100];
};

您有一个指向字符数组的指针。由于一个chars数组相当于一个指向一堆chars的指针,就char *name[100]相当于一个指向一堆chars指针的指针。如果您打算拥有多组 100 个字符数组,这可能很有用,但很明显这不是您的意图。

strncpy(p->name, name, 500);

根据上述定义,将尝试将字符串复制到指向一堆字符的指针中,而不是所需的

struct Person{
    char name[100];
    char nationality[100];
};

strncpy(p->name, name, 500);

它将字符串复制到一堆字符中。

于 2013-07-03T03:41:16.000 回答