如何初始化包含数组的结构

时间:2015-03-03 22:36:17

标签: c arrays initialization structure

#include <stdio.h>

struct Name {char d[11]};

int main (){

  char str[11];
  scanf("%s",str);

  struct Name new = {str};
}

我想初始化Name结构new,但是有一个警告:建议围绕子对象的初始化。

如何将我读取的char数组放入Name结构中?

4 个答案:

答案 0 :(得分:4)

有几种方法:

int main ()
{
  char str[11];
  scanf("%10s",str); // Make sure you don't read more than 
                     // what the array can hold.

  struct Name name1 = {"name"}; // This works only if you use string literal.
  struct Name name2;
  strcpy(name2.d, str);         // Use this when you want to copy from another variable.
}

答案 1 :(得分:0)

你可以这样做:

#include <stdio.h>

struct Name {char d[11];};

int main (){

  char str[11] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11};
  scanf("%s",str);

  // The below is C99 style.
  struct Name new = { .d = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11}};
  struct Name new2 = { .d = "hi mum"};

  // Memcpy does the job as well
  memcpy(new.d, str, sizeof(str));
}

修改

如果你想要的是将str缓冲区中的任何内容复制到Name,你可以像上面那样进行复制。你也可以这样做。

struct Name new;
scanf("%s", new.d); /* Work directly on the structure. */

有关C99样式结构初始化的更多信息,请查看此StackOverflow问题:C struct initialization with char array

还注意到R. Sahu警告不要读数超过数组可以容纳的数。

答案 2 :(得分:0)

在C中初始化struct时,最好创建一个函数来进行初始化。我习惯使用名称行init _&#34; struct of name&#34;。对于你的情况,一个简单的strncpy将初始化你的字符串字段。我使用strncpy来避免写掉字符串的结尾。提示使用#define设置所有字符串的长度。当字符串长度发生变化时,您可以通过一个简单的方法来解决问题。这是使用init函数的代码

#include <stdio.h>
#include <string.h>
#include <stdlib.h>


#define NAME_LEN (11)

struct Name { char d[NAME_LEN]; };

void init_name(struct Name * n, char *s); // proto types should go in a h file


void init_name(struct Name * n, char *s)
{
    strncpy(n->d, s, NAME_LEN);  // copy s to name file d
}

int main(){

    char str[11];
    struct Name newName;
    scanf("%s", str);

    init_name(&newName, str);
}

答案 3 :(得分:0)

given the problems with the scanf() 
given the probability of a buffer overflow/undefined behaviours, etc

I suggest using:

#include <stdio.h>

#define MAX_LEN (11)

// define the struct
struct Name {char d[MAX_LEN]};

// declare instance of the struct
struct Name myName;

int main ()
{
    // remember: char *fgets(char *str, int n, FILE *stream)
    if( fgets( myName.d, MAX_LEN, stdin ) )
    { // then fgets successful
         printf( "%s\n", myName.d);
    }
    else
    { // else, fgets failed
        printf( "fgets failed\n");
    }
    return( 0 );
} // end function: main