【算法筆記】Codeup 100000572B

本專欄僅僅用於個人記錄刷題過程,如有更好的解決方法,可以留言哦

題目要求
定義一個結構體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));
    怎麼輸出都不對
    輸入:人數1,編號10101,姓名LiLin,性別M,年齡18
  • 我就想起了 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均正確)
輸入:人數1,編號10101,姓名LiLin,性別M,年齡18

  • 定睛一看,%c那個地方是空格!所以,輸完了LiLin 之後的空格被%c識別了並且輸出了(即sex = 空格)
    第二件事情:%d那個地方爲啥是0?我不知啊啊(先挖坑,以後再填),知道的兄dei給我留言

總結

  • %s通過空格作爲一個字符串的結束
  • %c可以識別空格並將其輸出
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章