【C语言天天练(十五)】字符串输入函数fgets、gets和scanf
来源:互联网 发布:毕业后悔做程序员2016 编辑:程序博客网 时间:2024/04/29 01:06
引言:如果想把一个字符串读到程序中,必须首先预留存储字符串的空间,然后使用输入函数来获取这个字符串。
读取字符串输入的第一件事是建立一个空间以存放读入的字符串。
char *name;
scanf("%s", name);
这段代码虽然可能通过编译,但因为name可以指向任何地方,所以它的输入值可能覆盖以前name所指位置的值。
解决办法是声明一个固定大小的字符数组,或者使用C库里的分配存储空间的函数。
1、gets函数从系统标准输入获得一个字符串,读取字符串直到遇到一个换行符(\n),它读取换行符之前的所有字符,在这些字符后添加一个空字符(\0),然后把这个字符串交给调用它的程序。它把读取的换行符直接丢弃,而不是把它放入字符串中,这与下面讨论的fgets函数不同,下面再给出例子证明这一点。
#include <stdio.h>
char *gets(char *s);
示例:
#include <stdio.h>#define MAX 18intmain(int argc, char **argv){char name[MAX];char *ptr;printf("what't your name?\n");ptr = gets(name);/*注意:gets()返回的指针与传递给它的是同一个指针*/printf("%s? Ah ! %s\n", ptr, name);return 0;}
注意,如果gets出错时它返回一个空地址,因此在使用时一般使用如下技巧:
while((ptr = gets(name)) != NULL){……}
a、它需要第二个参数来说明组大读入字符数。如果这个参数值为n,fgets()就会读取最多n-1个字符或者读完一个换行符为止。
b、如果fgets读取到换行符,就会把它存放在字符串里,而不是像gets()那样丢弃它。也就是说它在字符串的最后存放的是换行符(\n),而不是空字符(\0)。
c、它还需要第三个参数来说明读哪一个文件。
#include <stdio.h>
char *fgets(char *s, int size, FILE *strem);
示例
#include <stdio.h>#define MAX 18intmain(int argc, char **argv){char name[MAX];char *ptr;printf("what't your name?\n");ptr = fgets(name, MAX, stdin);printf("%s? Ah ! %s\n", ptr, name);return 0;}编译测试结果显示:
what't your name?libinglibing? Ah ! libing它显示了fgets()的一个不足之处,fgets()把换行符存储到字符串里了,这样每次显示字符串时就会显示换行符。
下面对fgets()和gets()两个函数对于换行符不同处理的示例证明:
#include <stdio.h>#define MAX 18intmain(int argc, char **argv){char name1[MAX];char name2[MAX];char *ptr;printf("what't your name?\n");ptr = fgets(name1, MAX, stdin);ptr = gets(name2);if(strcmp(name1, name2)){<span style="white-space:pre"></span>/*比较两个字符串,因为gets会在最后将\n改为\0存入字符串,而fgets会直接将\n存入字符串*/printf("name1 is not equal name2\n");}return 0;}
3、scanf()和gets()主要的差别在于它们如果决定字符串何时结束。scanf()更给予获取单词而不是获取字符串;而gets()函数,会读取所有的字符,直到遇到第一个换行符为止。scanf()使用两种方法决定输入结束,如果使用%s格式,字符串读到下一个空白字符。如果指定了字段宽度,比如%10s,scanf()就会读入10个字符或直到遇到第一个空白字符,由二者中最先满足的哪一个终止输入。
#include <stdio.h>intmain(void){char name1[11], name2[11];int count;while(1){printf("please input 2 names.\n");count = scanf("%5s %10s", name1, name2);printf("I read the %d names %s and %s.\n",count, name1, name2);}return 0;}运行执行测试:
please input 2 names.Jesse JukesI read the 2 names Jesse and Jukes.please input 2 names.Liza ApplebotthamI read the 2 names Liza and Applebotth.please input 2 names.Portensia CallowitI read the 2 names am and Portensia.please input 2 names.I read the 2 names Callo and wit.
0 0
- 【C语言天天练(十五)】字符串输入函数fgets、gets和scanf
- 【C语言天天练(十八)】字符/字符串输入函数fgetc、fgets、getc、getchar和gets
- Linux C 字符串输入函数 gets()、fgets()、scanf() 详解
- 字符串输入函数,scanf,gets,fgets的用法和区别
- 字符串输入函数gets( ) fgets( ) scanf( )
- 【C语言天天练(二十)】scanf函数详解
- C语言中scanf函数和gets函数在输入字符串时的区别
- 输入函数gets()、fgets()、scanf()、getchar()
- fgets、gets、scanf函数读入字符串比较
- 字符串输入gets()、fgets()和字符串输出puts()、fputs()函数
- (c语言)回文字符串的判断,gets和scanf
- C语言gets()和scanf()函数
- 字符串输入gets和fgets函数的区别
- C语言字符串读取函数 gets()与fgets()
- 字符串的输入和输出(认识gets()fgets()scanf()和puts()fputs()printf()) ---CCS常用STDIO
- 【C语言天天练(十六)】字符串输出函数puts、fputs和printf
- 【C语言天天练(十七)】字符/字符串输出函数fputc、fputs、putc、putchar和puts
- C语言 gets()和scanf()函数的区别
- 发送验证码
- vxi总线
- C++学习01——语言初窥
- C语言中的声明与定义的区别
- VME总线
- 【C语言天天练(十五)】字符串输入函数fgets、gets和scanf
- daloradius安装之后登录为空白页
- 再论字符数组和字符指针
- mongo基本语法 快速上手
- 关于ios 和 android 录音(语音)对聊文件格式问题
- android自定义进度条样式
- android - anim translate中 fromXDelta、toXDelta、fromYDelta、toXDelta属性
- [C] 存储类——《C Primer Plus》
- mysql性能优化-慢查询分析、优化索引和配置