作者是一名刚接触C语言不就的新手,最近在学习结构体部分的知识遇到了一些问题。先上代码
/*using an array of structures*/
#include <stdio.h>
#include <string.h>
#define TSIZE 45/*size of array to hold title*/
#define FMAX 5/*maximum number of film titles*/
struct film{
char title[TSIZE];
int rating;
};
char *s_gets(char *st,int n);
int main(){
struct film movies[FMAX];
int i=0;
int j;
puts("enter first movie title:");
while(i<FMAX&&s_gets(movies[i].title,TSIZE)!=NULL&&movies[i].title[0]!='\0'){
puts("enter your rating<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\n");
else
printf("here is the movie list :\n");
for(j=0;j<i;j++){
printf("Move :%s Rating:%d\n",movies[j].title,movies[j].rating);
}
printf("Bye\n");
return 0;
}
char *s_gets(char *st,int n){
char *ret_val;
char *find=NULL;
ret_val=fgets(st,n,stdin);
if(ret_val)
{
find =strchr(st,'\n');//look for newline
if(find) //if the address is not NULL
*find='\0'; //place a null character there
else
while(getchar()!='\n')
continue; //dispose of rest of line
}
return ret_val;
}
这个函数的主要功能是把电影名存入结构体数组中去,每次输入完电影名后再输入序号。如果输入电影名的数目大于结构体能容纳的数目或者输入空白行程序默认输入结束,程序打印输出结构体中的内容。程序运行的结果如下:
在此程序中通过宏定义规定输入的电影名数目为5
#define TSIZE 45/*size of array to hold title*/
#define FMAX 5/*maximum number of film titles*/
为了能通过键盘输入控制电影名的最大数目,使用动态分配内存的函数malloc分配内存区域用于存放电影名。使用了malloc函数必须使用free函数将内存释放,否则会导致内存泄漏!!!;修改后的代码如下
/*this program have not finish*/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define TSIZE 45/*size of array to hold title*/
#define FMAX 5/*maximum number of film titles*/
char title[TSIZE];
int rating;
};
struct film *movies;
int i=0;
int j,n;
printf("enter the number of the movies\n");
scanf("%d",&n);
movies=(struct film *)malloc(n*sizeof(struct film));
puts("enter first movie title:");
s_gets(movies->title,TSIZE);
while(i<n&&s_gets((movies+i)->title,TSIZE)!=NULL&&(movies+i)->title[0]!='\0'){
puts("enter your rating<0-10>:");
scanf("%d",&(movies+i)->rating);
while(getchar()!='\n')
continue;
puts("Enter next movie title(empty line to stop;)");
i++;
}
if(i==0)
printf("no data entered\n");
else
printf("here is the movie list :\n");
for(j=0;j<i;j++){
printf("Move :%s Rating:%d\n",(movies+j)->title,(movies+j)->rating);
}
printf("Bye\n");
free(movies);
return 0;
}
char *ret_val;
char *find=NULL;
ret_val=fgets(st,n,stdin);
if(ret_val)
{
find =strchr(st,'\n');//look for newline
if(find) //if the address is not NULL
*find='\0'; //place a null character there
else
while(getchar()!='\n')
continue; //dispose of rest of line
}
return ret_val;
}
puts("enter first movie title:");
s_gets(movies->title,TSIZE);
while(i<n&&s_gets((movies+i)->title,TSIZE)!=NULL&&(movies+i)->title[0]!='\0'){
puts("enter your rating<0-10>:");
scanf("%d",&(movies+i)->rating);
while(getchar()!='\n')
continue;
puts("Enter next movie title(empty line to stop;)");
i++;
}
将“.”操作符换成“->”操作符后必须在while循环之前使用调用char *s_gets(char *st,int n))程序才能正常进入循环体,注释掉程序中的s_gets(movies->title,TSIZE);后的运行结果如下
由程序结果推测可知
s_gets函数是通过标准输入函数获得电影名字符串,使用“.”操作符时
while(i<FMAX&&s_gets(movies[i].title,TSIZE)!=NULL&&movies[i].title[0]!='\0')
在while循环的判断条件中,结构体会访问到movies中的成员。并且会执行s_gets函数。程序能正常进入循环
使用“->”操作符时:
while(i<n&&s_gets((movies+i)->title,TSIZE)!=NULL&&(movies+i)->title[0]!='\0')
经过本人测试注释掉(movies+i)->title[0]!='\0'以及s_gets(movies->title,TSIZE);这部分代码时程序能进入循环但是在程序运行时会导致不能提前退出程序和打印结果,程序运行结果如下:
程序未能正常进入循环
48 char *s_gets(char *st,int n){
49 char *ret_val;
50 char *find=NULL;
51 ret_val=fgets(st,n,stdin);
52 if(ret_val)
53 {
54 find =strchr(st,'\n');//look for newline
55 if(find) //if the address is not NULL
56 *find='\0'; //place a null character there
57 else
58 while(getchar()!='\n')
59 continue; //dispose of rest of line
60 }
61 return ret_val;
62 }
通过对比可知“.”操作符和“->”操作符在访问结构体里面的成员时有明显的区别。在使用->操作符应当注意指向的成员是否被修改,能否满足程序执行的条件。
程序摘自C Primer Plus 书中p602页的例程,本人第一次写博客。水平有限,错误之处希望能指出来,以便修改。有什么问题欢迎讨论,一起共同学习。