#include <stdio.h>
struct Name {char d[11]};
int main (){
char str[11];
scanf("%s",str);
struct Name new = {str};
}
我想初始化Name结构new,但是有一个警告:建议围绕子对象的初始化。
如何将我读取的char数组放入Name结构中?
答案 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