#include<stdio.h>
#include<stdlib.h>//
#include<string.h>
#define TSIZE 45
#define FMAX 5
struct film{
char title[TSIZE];
int rating;
struct film * next;
};
char * s_gets(char *st,int n)
{
char * ret_val;
char * find;
ret_val=fgets(st, n, stdin);//if没到结尾返回首字符的地址 else 返回NULL
if(ret_val)//如果非NULL // 这个程序的作用就是如果正常结束时将里面的换行符替换为\0以此来告诉电脑读取结束
{ //也具有清空\n的效果
find=strchr(st,'\n');//查找'\n'首次出现的位置,并返回char指针
if(find) //if地址不是NULL 就是程序正常读入
*find='\0'; //在这个地方放置一个空字符
else //if非正常结束 一个while(getchar)把所有溢出数据处理完
while(getchar()!='\n')
continue;
}
return ret_val;
}
int main()
{
struct film movies[FMAX];
int i=0;
int j;//movie[i]是结构体数组movie的其中一项,而 movies[i].title是其中的数组名movies[i].title[i]才是char
puts("Enter first movie title:");// 单纯的数组名表示这个数字第一个元素的地址,所以是 char*
while(i<FMAX && s_gets(movies[i].title,TSIZE)!=NULL&&
movies[i].title[0]!='\0')//movies[i].title[0]!='\0'是用来读取空输入的,如果空输入则首尾放\0
{
puts("Enter your tating<0-10>:");
scanf("%d",&movies[i++].rating);
while(getchar()!='\n')
continue;
puts("Enter next movie title (empty line to stop):");
}
if(i==0)//没输入
printf("No data entered.");
else
printf("Here is the movie list:\n");
for(j=0;j<i;j++)
printf("Movie: %s Rating: %d\n",movies[j].title,movies[j].rating);
printf("Bye!");
retuen 0;
}
知识点:{
1.单纯的数组名表示这个数字第一个元素的地址,所以是 char* (&陈s学长)
2.char * s_gets(char *st,int n)传参是传进的是数组首地址的指针,char * 是返回值类型(迷了好久··无语)
3.find=strchr(st,'\n'); strchr函数,从参数一(char* 数组首元素地址)开始寻找参数二,找到则返回char*,没找到返回NULL
4.(重点)
一. fgets(st, n, stdin);参数一表示要输入的数组(char* 数组首元素地址),参数二是输入char个数(如果溢出也能输入但是每n个中间以\0分隔开)参数三表示输入类型,stdin表示键盘输入;
二. 对应的输出是fputs(st, n, stdout);前俩参数作用一样,stdout表示输出到屏幕;
三. fgets可以有返回值也可以没有,若没有则执行基本操作,若有则分情况,正常输入情况下返回首元素的char*,溢出或非法输入则返回NULL
}
这个程序是链表的第一节,也是一个引子,但还是花了我很长时间去理解,主要是其中的指针几乎是我第一次正面的接触。恩,今天就这样吧,加油!;
(PS:已经不会用。结尾了,全是;;;;ε=(´ο`*)))唉~)