c 定义结构体

manybook.c

#include <stdio.h>//Remarks0
#include <string.h>//Remarks1
#define maxtitle 40  //字符串数组anthor的长度
#define maxauthor 40//字符串数组anthor的长度
#define maxbooks 3 //结构体数组存放的书籍的最大数量
char *s_get(char *st,int n);//Remarks2
struct book                 //Remarks3
{
  char title[maxtitle];
  char author[maxauthor];
  float value;
};
int main(void)
{
  struct book library[maxbooks];//Remarks4
  int count = 0;//存储书的本数
  int index;//for循环遍历变量类似常用i
  printf("Welcome to the library system.\n");//界面欢迎语,体现人机的交互性
  printf("Please enter the book title.\n");//提示用户输入书本标题(名称)
  printf("Press [enter] at a start of line to stop.\n ");//当用户按下enter键表示输入终止
  while(count<maxbooks && *s_get(library[count].title,maxtitle)!=NULL
                                 && library[count].title[0]!='\0')//Remarks5
   {
      printf("Now enter the author \n");//提示用户现在输入书籍的作者
      s_get(library[count].author,maxauthor);
      /*利用字符串指针函数s_get()函数从键盘上获取输入,并将输入的字符赋给第count本书的作者名称*/
      printf("Now enter the value.\n");//提示用户当前输入书的价格
      scanf("%f",&library[count++].value);//从键盘上获取数值赋值给第count本书的价格

  if(count<maxbooks)
   {
     printf("Enter  the next title.\n");
   }

      while(getchar()!='\n')//Remarks6
        continue;//清理输入行
   }

  if(count>0)//Remarks7
         {
          printf("Here is the list of your books:\n");
          for(index=0;index<count;index++)
            {
               printf("%s by %s :$%.2f\n",library[index].title,
                  library[index].author,library[index].value);

            }
         }
   else
       printf("No Books? Too Bad.\n");


      return 0;

}
char *s_get(char*st,int n)//Remarks8
{
  char CH;  //定义字符变量以便临时存储键盘上输入的字符
  char *ret_val;//定义字符串指针变量,用于存储fgets函数的返回值
  char *find;   //定义字符串指针变量,用于存储strchr(st,'\n')的返回值
  ret_val = fgets(st,n,stdin);//Remarks9
  if(ret_val)
  {
    find = strchr(st,'\n'); //Remarks10
    if(find)
      *find = '\0';
    else
      while((CH=getchar())!='\n')
      continue; //处理行中剩余的字符
  }
  return ret_val;
}
/*---------------------------Remarks0------------------------------------------
     一般地,在C语言或C++中,会把用来#include的文件的扩展名叫 .h,
 称其为头文件。 #include文件的目的就是把多个编译单元(也就是c或者cpp文件)
 公用的内容,单独放在一个文件里减少整体代码尺寸;或者提供跨工程公共代码。
 stdio 就是指 “standard input & output"(标准输入输出)
 所以,源代码中如用到标准输入输出函数时,就要包含这个头文件!
 例如c语言中的 printf("%d",i); scanf("%d",&i);等函数。[1]
-----------------------------------------------------------------------------------*/


/*---------------------------Remarks1-------------------------------------------
C语言标准库中一个常用的头文件,在使用到字符数组时需要使用。
常用字符串函数 strlen求字符串长度
strcmp比较2个字符串是否一样
strcat字符串连接操作
strcpy字符串拷贝操作
strncat字符串连接操作(前n个字符)
strncpy字符串拷贝操作(前n个字符)
strchr查询字串
strstr 查询子串
-------------------------------------------------------------------------------------*/
/*---------------------------Remarks2-----------------------------------------------
定义字符串获取函数。 函数名为s_get,返回值为字符指针型 形式参数为2个
1为字符串指针,2为整形变量
--------------------------------------------------------------------------------------*/
/*---------------------------Remarks3----------------------------------------------
  简历book的模板,即定义结构体book,book library[maxbook];
 与int a[N];功能类似,只不过int为整型,book为结构体,其中同时内涵
  char title[maxtitle];char author[maxauthor];float value;
  三种类型的变量。
-------------------------------------------------------------------------------------*/
/*---------------------------Remarks5----------------------------------------------
 定义结构体数组变量,结构体数组名为library,长度为maxbook
-------------------------------------------------------------------------------------*/
/*---------------------------Remarks6----------------------------------------------
  当书本数小于最大数量maxbook时且s_get函数的返回值不等于NULL(空)且
 最后一本书的标题第一个字符不是'\0'(空字符)就继续执行,用户输入书本信息
-------------------------------------------------------------------------------------*/
/*---------------------------Remarks7----------------------------------------------
  只要键盘输入的不是换行就退出,break是结束循环。
 continue是结束本次循环。
 循环是有很多次的,break之后不再循环,
continue结束本次循环后,再开始下一次的循环。


--------------------------------------------------------------------------------------*/
/*---------------------------Remarks8-----------------------------------------------
  count大于0,表示有书籍的存在,用for语句进行遍历全部的书,并在屏幕上显示、
 相关信息
--------------------------------------------------------------------------------------*/
/*---------------------------Remarks9------------------------------------------------
函数原型
char *fgets(char *buf, int bufsize, FILE *stream);
参数
*buf: 字符型指针,指向用来存储所得数据的地址。
bufsize: 整型数据,指明存储数据的大小。
*stream: 文件结构体指针,将要读取的文件流。
返回值
成功,则返回第一个参数buf;
在读字符时遇到end-of-file,则eof指示器被设置,如果还没读入任何
        字符就遇到这种情况,则buf保持原来的内容,返回NULL;
如果发生读入错误,error指示器被设置,返回NULL,buf的值可能被改变。[1]

        同时可以用作键盘输入:fgets(key,n,stdin)且还必须:
        key[strlen(key)]='\0'或者key[n-1]='\0'
        stdin:标准键盘输入
-------------------------------------------------------------------------------------------*/
/*--------------------------Remarks10------------------------------------------------------
    strchr是计算机的一个函数,原型为
    extern char *strchr(const char *s,char c),
    可以查找字符串s中首次出现字符c的位置。
    char *strchr(const char* _Str,char _Val)
    char *strchr(char* _Str,char _Ch)
    头文件:#include <string.h>
    功能:查找字符串_Str中首次出现字符_Val的位置
 说明:返回首次出现_Val的位置的指针,返回的地址是被查找字符
 串指针开始的第一个与Val相同字符的指针,如果Str中不存在Val
 则返回NULL。
 返回值:成功则返回要查找字符第一次出现的位置,失败返回NULL

---------------------------------------------------------------------------------------------------*/

 

需要说明的是该例子编译的时候报警告。并且原例子有部分错误,上述代码已经修正。

需要使用 -w来屏蔽警告。

 

参考:

结构体:https://blog.csdn.net/shuipengpeng/article/details/79250630

gcc关闭警告:https://blog.csdn.net/qq_14821541/article/details/54314490

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值