请问结构体数组赋值的方法?具体看下面

我定义了一个结构体数组,
struct save_account//保存登录帐户密码
{
char account[10];
char password[10];
}users[10] = {0};
和两个数组:
a[10] ;pwd[10];
现在我要把值赋给这个结构体,该怎么做?下面两种可以吗?
1、strcpy(users[].account,a[]);
2、for(i = 0; i < 8;i++)
{
users[i].account = a[i];
users[i].password = pwd[i];
或者其他方法,在线等,谢谢大家!
strcpy(users[10].account,a[10]);是不是只是把数组中第十个元素复制?要用for循环赋值吗

我来分析一下,
struct save_account//保存登录帐户密码
{
char account[10];
char password[10];
}users[10] = {0};
这个我理解是定义了一个结构数组users[10], 并初始化为0.
也就是说user[]数组有10个元素,每个元素是上面的这样一个结构.

下面来看strcpy这个函数,是标准c库函数, 原型是
char * strcpy(char * strDest,const char * strSrc);

这个函数是把src所指由NUL结束的字符串复制到dest所指的数组中。
所以用这个函数,字符串必须以NULL结束,否则可能会发生访问越界. 而两个参数应该是数组首地址,所以如果要用这个函数,应该这样写strcpy(users[10].account,a);
可以构造一个循环,代码如下:
for(i = 0; i < 10;i++)
{
strcpy(users[i].account,a);
strcpy(users[i].password,pwd);
}

至于你提出的方法2的直接给数组附值,是不合法的.追问

for(i = 0; i < 10;i++)
{
strcpy(users[i].account,a);
strcpy(users[i].password,pwd);
}
循环有什么用呢?不是一整个数组a都赋给users.account吗?如果strcpy(users[i].account,a);不是一直把a的首元素复制给users[i].account十次吗?

追答

首先你要知道, users[]本身是一个结构数组,他有10个元素,每个元素都是一个结构.而这个循环中i的值是会改变的, 所以在循环体中的users[i]会遍历整个结构数组users[].

然后,a并不是数组a[]的首元素, 这是c语言的一个语法, a表示的是数组a[]的首地址, 也可以说是数组a[]首元素的地址, 即a是指向数组a[]首元素的常指针. 注意这里, a是个常量, 是不可变的.
所以, strcpy(users[i].account,a);这句的意思是把数组a[]中的字符串复制到数组users[i].account[]中.

温馨提示:答案为网友推荐,仅供参考
第1个回答  2020-02-24
我理解的你的意思应该是,有十个用户,每个用户都有不同的登录账号和密码,然后再把a数组和pwd数组里面的十个账号密码分别赋值给十个用户。

这里为了简便,我只写了三个用户。
不过不确定我理解的是不是对的,如果不是,就见笑了。
#include "stdafx.h"
#include <stdio.h>
#include <string.h>
#include <Windows.h>
void main()

{

char a[3][4] = {{"abc"},{"def"},{"ghi"}};//三个初始账号值

char pwd[3][4] = {{"ABC"},{"DEF"},{"GHI"}};//三个初始密码值

struct save_account//保存登录账户密码

{

char account[4];

char password[4];

}users[3] = {0};

for(int i = 0; i < 3;i++)

{

strcpy_s(users[i].account,&a[i][0]);//将a数组中保存的第i个初始账户赋值给用户i

printf("users[%d].account = %s\n",i,users[i].account);

strcpy_s(users[i].password,&pwd[i][0]);//将pwd数组中保存的第i个初始密码赋值给用户i

printf("users[%d].password = %s\n",i,users[i].password);

}

system("pause");

}
第2个回答  2011-10-02
应该可以这样:
for(int i=0;i<10;i++)
{
strcpy( users[i].account,a);
strcpy( users[i].password,pwd);
}
strcpy(char *dest,char *src )第一个参数是目标地址,第二个是要复制的源地址(注意只要提供首地址即可)
第3个回答  2011-10-02
strcpy函数,两个参数必须是字符型指针类型,第二个参数必须是完整的字符串,也就是必须带'\0'结束标志。不能strcpy(users[10].account,a[10]);调用,如果想复制,需要strcpy(users[10].account,a);这样使用之前,必须保证a素组里含有'\0'。
第二种方法,不能保证把a数组和pwd数组表示的字符串末尾的'\0'标志复制到users[i].account和users[i].password里,也就是不能保证users[i].account和users[i].password表示的字符串的完整性。这样,以后users[i].account和users[i].password当做字符串使用时,没有结束标志,会出错误。
第4个回答  2011-10-02
你没有试试么?试试运行下,看看结果,第二种没问题应该。追问

第二种好像不可以