本文目錄一覽:
- 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的時間資源;
原創文章,作者:VDNM,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/133649.html