我有这样的结构
typedef struct bookStruct
{
char title[80];
char author[80];
} BookType;
我有两个这样的字符串
char *title = "A Book on C";
char *author = "A. Kelly";
现在我无法像这样创建BookType
BookType book = {title, author};
谁能告诉我有什么问题?我怎么能这样做?
答案 0 :(得分:6)
您的问题有两种可能的解决方案。第一个是在构造位置使用字符串文字:
BookType book = { "A book on C", "A. Kelly" };
在这种情况下,编译器会将文字复制到适当的变量中。如果您无法在初始化中使用文字,那么您必须自己复制元素:
BookType book = { 0 }; // 0 initalize
strncpy( book.title, title, sizeof(book.title)-1 );
strncpy( book.author, author, sizeof(book.author)-1 );
答案 1 :(得分:3)
void InitBookStruct(BookType *book, const char *title, const char *author){
size_t title_length = sizeof book->title;
size_t author_length = sizeof book->author;
strncpy(book->title, title, title_length - 1); //-1, make way for null byte
strncpy(book->author, author, author_length - 1);
book->title[title_length - 1] = 0;
book->author[author_length - 1] = 0;
}
上面有很多方法,其中之一就是其中之一。
从手册页,
char * strncpy(char * dest,const char * src,size_t n);
如果src的长度小于n,则strncpy()将填充其余部分 dest为空字节。
因此,指定(小于1)dest
的大小就足够了。
答案 2 :(得分:2)
您必须使用strcpy(如果您知道输入的长度)或安全功能。
许多其他答案都犯了同样的错误,即留下未终止的字符串,这是安全漏洞的主要来源。
正确的方法是使用安全的字符串复制功能,比如StringCbCopy或自己滚动(尽管不那么健壮):
// Copy at most n-1 characters to dst, truncating if strlen(src) > n-1
// and guaranteeing NUL-termination.
void safe_strcpy(char *dst, const char *src, size_t n) {
strncpy(dst, src, n-1);
dst[n-1] = 0; // Guarantee NUL-termination.
}
然后你可以按如下方式使用它
void f(const char *title, const char *author) {
BookType book;
safe_strcpy(book.title, title, sizeof book.title);
safe_strcpy(book.author, author, sizeof book.author);
}
答案 3 :(得分:2)
如果您将结构更改为此应该可以正常工作
typedef struct bookStruct
{
char* title;
char* author;
} BookType;
答案 4 :(得分:1)
据我所知,在C中无法做到这一点。你最好的选择可能是使用宏:
#define TITLE "A Book On C"
#define AUTHOR "A. Kelley"
BookType book {TITLE, AUTHOR};
虽然这当然没有完全相同的效果。