本文目录一览:
- 1、C语言结构体成员变量的中字符串型数值型在一个scanf函数里输入的问题
- 2、C语言结构体赋值的问题,刚输入第一个name就提示出错
- 3、请问在C语言中怎样对结构体中的字符串进行赋值?
- 4、C语言,结构体问题?所占内在字节数,怎么算的???
- 5、c语言位操作的位字段填充
C语言结构体成员变量的中字符串型数值型在一个scanf函数里输入的问题
//修改了一点,注意看说明
#include stdio.h
#include stdlib.h
struct stu
{
char name[10];
int num;
int age;
char addr[15];
}sa[3],sb[3],*pp,*qq; //创建结构体类型struct stu的同时,定义结构体数组sa、sb,定义结构体指针变量 pp、qq。
int main()
{
FILE *fp;
char ch;
int i;
if((fp=fopen("D:\\学习\\C语言源码\\devC++\\第13章 文件\\stu_list.txt","w"))==NULL) //以只写的方式打开文件 ,没有该文件的情况下会创建该文件
{
printf("Cannot open file,press any key to exit");
getchar();
exit(0);
}
printf("input data\n");
pp=sa;
for(i=0;i3;i++,pp++)
{
scanf("%s%d%d%s",pp-name,pp-num,pp-age,pp-addr); //先用scanf给结构体的成员变量赋值
//在下在这句多加几个空格,作为输入数据的分隔符,注意输入的人名和地址中应该没有空格,不然会出错
//或者文件的输入和输出全部指定宽度
fprintf(fp,"%s %d %d %s\n",pp-name,pp-num,pp-age,pp-addr); //然后用fprintf将结构体成员变量的值写入fp所指向的文件stu_list.txt中去
}
fclose(fp); //完成写入文件操作后,关闭文件,使指针fp不再指向该文件
fp=fopen("D:\\学习\\C语言源码\\devC++\\第13章 文件\\stu_list.txt","r"); //以只读的方式打开文件
qq=sb;
printf("name\tnumber age addr\n");
for(i=0;i3;i++,qq++)
{
fscanf(fp,"%s%d%d%s",qq-name,qq-num,qq-age,qq-addr); //先用fscanf将fp所指向的文件stu_list.txt中的值读取到结构体成员变量中
printf("%s\t%5d%3d%s\n",qq-name,qq-num,qq-age,qq-addr); //然后用printf输出结构体变量的值
}
fclose(fp); //完成读取文件操作后,关闭文件,使指针fp不再指向该文件
}
C语言结构体赋值的问题,刚输入第一个name就提示出错
这里有两个问题需要注意:首先是stu.name是数组,因此赋值时不必再取地址,因为数组名就是首地址;同样,stu.sex,stu.age,stu.score是变量,所以需要去地址;因此代码应该为:
PR("name?");scanf("%s",stu.name);
PR("sex?");scanf("%c",stu.sex);
PR("age?");scanf("%d",stu.age);
PR("score?");scanf("%f",stu.score);
但这时候编译执行,你会发现输入完name以后,没有让你输入sex,便直接让输入age了,这个问题原因为:
scanf是从标准输入缓冲区中读取输入的数据,而%c的字符输入格式会接收回车字符,在输入第一个scanf时输入一串字符后按 回车结束,输入缓冲中保存了这个回车符,遇到第二个scanf时,它自动把这个回车符赋给了ch2。所以相当于已经执行了scanf("%c",stu.sex);输入的值是回车;而如果第二个scanf的输入格式不是%c时,由于格 式不匹配,这个回车符会被自动忽略;
解决办法:
1。清空输入缓冲区
第一个scanf后加入清空输入缓冲区函数:fflush(stdin);
代码变为:
PR("name?\n"); scanf("%s",stu.name);fflush(stdin);
PR("sex?\n"); scanf("%c",stu.sex);
PR("age?\n"); scanf("%d",stu.age);
PR("score?\n"); scanf("%f",stu.score);
2。格式控制中加入空格
将第二个scanf改为:scanf(" %c",stu.age);//在%号前面加一个空格,此时由于与回车不匹配秒就把回车忽略了
代码变为:
PR("name?\n"); scanf("%s",stu.name);
PR("sex?\n"); scanf(" %c",stu.sex);
PR("age?\n"); scanf("%d",stu.age);
PR("score?\n"); scanf("%f",stu.score);
此时便可得到你想要的结果。
请问在C语言中怎样对结构体中的字符串进行赋值?
bbb,cccc" ;
string[] sArray=a.Split(",");
对应的sArray[0]就存放着aaaa
sArray[1]就存放着bbbb
依此类推
然后就是根据你的要求对结构体赋值
首先要先定义一个结构体kk
kk.te=sArray[0];
类似这样的赋值就可以了
C语言,结构体问题?所占内在字节数,怎么算的???
在c语言中如何计算结构体长度和共用体长度?
结构体的长度等于体内各个成员变量长度之后。如此题长度为字符串数组的长度加上两个int型变量的长度,再加上double长度,最后结果为10+2+2+8=22。解析:char 每个字符占一个字节(因为是一个十长度的字符数组)所以是10字节,int占两个字节,double占8个字节。所以最后是10+2*2+8=22。
共用体的长度是体内成员中最长的长度。如果一个共用体内最长长度为12字节,则共用体的长度就是12。
希望能够帮到你。如果还有什么问题在问?
c语言位操作的位字段填充
单片机分8bit\16bit\32bit的数据宽度,这与硬件设计有关,我们在访问数据时,如过存储宽度是8bit的MCU,那么上图中 ,opaque 、fill_color、和第三行的缺省定义占了8bit,存储为1个有效的最小单元,后面的 show_border、bordrr_coler、border_style和后面的2bit缺省为一个8bit最小存储单元。这样做的目的是在访问这这结构体成员的的时候,可以快速的存取这些变量;如果不要缺省的第三行和第8行,读取数据时,需要移位的变量就会比较多,这样浪费MCU的时间资源;