2010-04-17 23 views
2

我有这样如何使用的char *为char []

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}; 

谁能告诉我什么是错的?我怎样才能做到这一点?

回答

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); 
+3

哇,这是毫无意义的坚持认为函数strncpy比strcpy的“更安全”的宗教信仰的极端的例子。或者可能是一个简单的“思考o”。使用'sizeof(book.title)-1'作为限制,或使用strlcpy:你的代码在任何意义上都没有“确保大小适合”:-) – 2010-04-17 12:48:13

+0

你是对的。计数应该是'sizeof(book.title)-1'。另一方面,评论并不意味着代码将确保,但用户必须确保它在调用方法之前适合。 – 2010-04-17 12:56:54

+0

'MIN(sizeof(book.title)-1,strlen(title)))'是不必要的。 http://stackoverflow.com/questions/2658182/how-to-use-char-as-char/2658217#2658217 – 2010-04-17 13:10:06

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); 
} 
1

你可以用它据我所知,在C中没有办法做到这一点。最好的办法是使用宏:

#define TITLE "A Book On C" 
#define AUTHOR "A. Kelley" 

BookType book {TITLE, AUTHOR}; 

尽管这当然不会有完全相同的效果。

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(字符* DEST,为const char * SRC,为size_t n)的;

如果src的长度小于n,则strncpy()用空字节填充 dest的其余部分。

因此,指定(小于)dest的大小就足够了。

+0

这不保证任何字段的空终止。 – 2010-04-17 13:11:58

+0

@亚历克斯:谢谢。更新。 – 2010-04-17 13:24:21

2

如果您改变了结构,这样它应该工作

typedef struct bookStruct 
{ 
    char* title; 
    char* author; 
} BookType; 
+0

适用于C99或C++。 – JRL 2010-04-17 13:08:48