首页 资讯 应用 高压 设计 行业 低压 电路图 关于

单片机

旗下栏目: PLC 嵌入式 单片机 DCS

getchar,getch,scanf,gets,getche函数

单片机 | 发布时间:2018-06-01 | 人气: | #评论# | 本文关键字:C,C语言,getchar,getch,scanf,gets
摘要:代码1: #includestdio.h #includestdlib.h #includeconio.h int main(){ struct node{ char name[10]; int score; }; struct nodestudent; FILE *fptr; if ((fptr=fopen( student.txt , wb ))==NULL){ printf( 无法打开student.txt ); exit(1); } do { printf(

代码1:

#include <stdio.h>  

  1. #include <stdlib.h>  

  2. #include <conio.h>  

  3. int main(){  

  4.     struct node{  

  5.         char name[10];  

  6.         int score;  

  7.     };  

  8.     struct node student;  

  9.     FILE *fptr;  

  10.     if((fptr = fopen("student.txt""wb")) == NULL){  

  11.         printf("无法打开student.txt");  

  12.         exit(1);  

  13.     }  

  14.     do{  

  15.         printf("\n\nEnter name:");  

  16.         gets(student.name);  

  17.         printf("Enter score:");  

  18.         scanf("%d", &student.score);  

  19.         fwrite(&student, sizeof(student), 1, fptr);  

  20.         printf("One more(Y/n)?");  

  21.     }while(getche() == 'y');  

  22.     fclose(fptr);  

  23.     getch();  

  24. }  

大家可以先过一遍,然后自己敲一下代码,(哈哈,不错,全出现了,gets,fwrite,getche,scanf)

问题::结果有点诡异

           

恩恩,大家可以看到了,第二次name还没有来得及输入就直接跳到了score,啊,啊,为什么,别急啊!

代码2:

#include <stdio.h>  

  1. #include <stdlib.h>  

  2. #include <conio.h>  

  3.   

  4. int main(){  

  5.     struct node{  

  6.         char name[10];  

  7.         int score;  

  8.     };  

  9.     struct node student;  

  10.     FILE *fptr;  

  11.     char scorebuf[81];  

  12.     if((fptr = fopen("student.txt""wb")) == NULL){  

  13.         printf("无法打开student.txt");  

  14.         exit(1);  

  15.     }  

  16.     do{  

  17.         printf("\n\nEnter name:");  

  18.         gets(student.name);  

  19.         printf("Enter score:");  

  20.         student.score = atoi(gets(scorebuf));  

  21.         fwrite(&student, sizeof(student), 1, fptr);  

  22.         printf("One more(Y/n)?");  

  23.     }while(getche() == 'y');  

  24.     fclose(fptr);  

  25.       

  26.     return 0;  

  27. }  

还是希望大家自己在头脑中过一遍,然后在敲一敲,

好:继续看

        

对,这回好了,但是,这是为什么呢?

当时刚看到这个程序,想不通,然后疑问还比较大,问了韩飞同学,他说:光是上面前面那几句,一个gets函数处理换行符,scanf不处理换行符,你明白吗?

哈哈,  谢谢他,给我指出了重要的一点,想着这些东西虽然小,但是还比较重要,就想着写下来,跟大家讨论讨论

我们来看一看:

1.函数gets(字符指针)

   头文件 stdio.h (c)      cstdio(c++ )  

   原型:char *gets(char*)    

   读入成功,返回与参数相同的指针,读入过程中遇到EOF或发生错误,返回NULL指针。

      但是,读取的结果是存放在参数指针所指向的那个数组里,也称buffer数组,但是在写入的时候,应该保证数组空间足够大,一边读写的时候不发生溢出。(如果溢出,多出来的字符将被写到堆栈中,会间接的覆盖堆栈原来的内容,破坏了其他的空间的值),假如空间足够大,那么函数会无限读取,相当于无限缓存,直至接受到换行符或EOF或发生错误

换行符不作为读取数组的内容,读取的换行符被转化成NULL值,并由此来结束字符串,(也就是说gets这个函数对这个换行符已经进行过处理了)

责任编辑:C语言
首页 | 电气资讯 | 应用技术 | 高压电器 | 电气设计 | 行业应用 | 低压电器 | 电路图 | 关于我们 | 版权声明

Copyright 2017-2018 电气自动化网 版权所有 辽ICP备17010593号-1

电脑版 | 移动版 原创声明:本站大部分内容为原创,转载请注明电气自动化网转载;部分内容来源网络,如侵犯您的权益请发送邮件到[email protected]联系我们删除。

Ctrl+D 将本页面保存为书签,全面了解最新资讯,方便快捷。