本專欄僅僅用於個人記錄刷題過程,如有更好的解決方法,可以留言哦
題目要求
定義一個結構體student,存儲學生的學號、名字、性別和年齡,讀入每個學生的所有信息,保存在結構體中,並輸出。結構體student的定義如下:
struct student {
int num;
char name[20];
char sex;
int age;
};
本題要求使用指向結構體數組的指針進行輸入和輸出
要求輸入
第一行有一個整數n,表示以下有n個學生的信息將會輸入。保證n不大於20。
以後的n行中,每一行包含對應學生的學號、名字、性別和年齡,用空格隔開。保證每一個人名都不包含空格且長度不超過15,性別用M和F兩個字符來表示。
樣例
3
10101 LiLin M 18
10102 ZhangFun M 19
10104 WangMin F 20
要求輸出
有n行,每行輸出一個學生的學號、名字、性別和年齡,用空格隔開。
請注意行尾輸出換行。
樣例
10101 LiLin M 18
10102 ZhangFun M 19
10104 WangMin F 20
可AC代碼如下
#include<stdio.h>
struct student{
int num;
char name[20];
char sex;
int age;
} stu[1000], *s;
int main(){
int n;
//保證n不大於20
while(1){
scanf("%d", &n);
if(n <= 20 && n >= 0){
break;
}else{
return 0;
}
}
//此次輸入必須加空格是因爲%s通過空格作爲一個字符串的結束,而%c可以識別空格並將其輸出
//只需在%s和%c中間加空格即可
for(s = stu; s < stu+n; s++){
scanf("%d%s %c%d", &(s->num), s->name, &(s->sex), &(s->age));
}
//輸出
for(s = stu; s < stu+n; s++){
printf("%d %s %c %d\n", s->num, s->name, s->sex, s->age);
}
return 0;
}
遇到的問題
- 沒有考慮到scanf時%s和%c對空格的不同部分
解決問題的過程
- 開始我是這樣寫的,中間無空格
scanf("%d%s%c%d", &(s->num), s->name, &(s->sex), &(s->age));
怎麼輸出都不對
- 我就想起了 scanf 有返回值,可以用返回值看一下
//此次輸入必須加空格是因爲%s通過空格作爲一個字符串的結束,而%c可以識別空格並將其輸出,只需在%s和%c中間加空格即可
int r;//接收scanf返回值
for(s = stu; s < stu+n; s++){
r = scanf("%d%s%c%d", &(s->num), s->name, &(s->sex), &(s->age));
}
//輸出
for(s = stu; s < stu+n; s++){
printf("%d : %d %s %c %d\n", r, s->num, s->name, s->sex, s->age);
}
r = 3,表示scanf正確輸入的變量是3個(num,name,sex均正確)
- 定睛一看,%c那個地方是空格!所以,輸完了LiLin 之後的空格被%c識別了並且輸出了(即sex = 空格)
第二件事情:%d那個地方爲啥是0?我不知啊啊(先挖坑,以後再填),知道的兄dei給我留言
總結
- %s通過空格作爲一個字符串的結束
- %c可以識別空格並將其輸出