如何使用char *作为char []

时间:2010-04-17 11:29:20

标签: c string pointers arrays

我有这样的结构

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

谁能告诉我有什么问题?我怎么能这样做?

5 个答案:

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

虽然这当然没有完全相同的效果。