scanf与gets读取字符串的区别

对于编程初学者很多人对gets和scanf都没做过深入的了解,本文为大家详细说明gets和scanf的区别

gets 

1、函数:gets(字符指针)

2、头文件:stdio.h(c中),c++不需包含此头文件

3、原型:char*gets(char*buffer);

4、功能:从stdin流中读取字符串,直至接受到换行符或EOF时停止,并将读取的结果存放在buffer指针所指向的字符数组中。注意:(换行符不作为读取串的内容,读取(接受)的换行符被转换为null值,并由此来结束字符串。)

5、返回值:读入成功,返回与参数buffer相同的指针;读入过程中遇到EOF(End-of-File)或发生错误,返回NULL指针。所以在遇到返回值为NULL的情况,要用ferrorfeof函数检查是发生错误还是遇到EOF。

6、注意:本函数可以无限读取,不会判断上限,所以程序员应该确保buffer的空间足够大,以便在执行读操作时不发生溢出。如果溢出,多出来的字符将被写入到堆栈中,这就覆盖了堆栈原先的内容,破坏一个或多个不相关变量的值,为了避免这种情况,我们可以用fgets()来替换gets()。这个事实导致gets函数只适用于玩具程序。在V7的手册(1979年)中说明:为了向后兼容,gets删除换行符,gets并不将换行符存入缓冲区。

scanf

1、函数:scanf(字符指针)

2、头文件:stdio.h(c中),c++不需包含此头文件

3、原型:int scanf(const char *format,...);

4、功能:从stdin流中读取字符串,直至接受到空白符、换行符或EOF时停止,并将读取的结果存放在format指针所指向的字符数组中。注意:(空白符、换行符不作为读取串的内容,读取(接受)的换行符被转换为null值,并由此来结束字符串。)

5、返回值:scanf()函数返回成功赋值的数据项数,读到文件末尾出错时则返回EOF。

和scanf("%s:",&s)的比较

1.不同点:

scanf不能接受空格、制表符Tab、回车等;

而gets能够接受空格、制表符Tab和回车等;

2.相同点:

字符串接受结束后自动加‘\0‘。

使用scanf("%s",&s);函数输入字符串时存在一个问题,就是如果输入了空格会认为字符串结束,空格后的字符将作为下一个输入项处理,但gets()函数将接收输入的整个字符串直到遇到换行为止

如有错误与遗漏,请跟帖指正,谢谢!

scanf与gets读取字符串的区别

时间: 2024-10-05 03:16:49

scanf与gets读取字符串的区别的相关文章

scanf() & gets() & fgets() 读取字符串的区别

scanf()和gets()读取字符串的区别 主要的差别在于它们如何决定字符串何时结束 scanf()更基于获取单词(get word)而不是获取字符串(get string): gets()会读取所有的字符,直到遇见第一个换行符为止. scanf()使用两种方法决定输入结束. 如果使用%s格式,字符串读到(但不包括)下一个空白字符(比如空格.制表符或换行符) 如果指定了字段宽度,比如%10s,scanf()就会读入10个字符或者直到遇见第一个空白字符,由二者中最先满足的那一个终止输入 注:无论

scanf 和 gets 读取字符串

深入了解scanf()/getchar()和gets()等函数 scanf与gets函数读取字符串的区别 今天看到一段话,大致是说gets比scanf()快,有点吃惊,搜了一下,scanf()和gets的区别大致有着几条: 1.scanf() 会忽略行开头的所有空格,并以空格.换行符结束输入: 使用getchar()读取scanf语句执行后,缓冲区留下的换行符, gets读入以任何字符开始的字符串,以换行符结束,但之后会丢弃换行符并以'\0'代替: 2. 在数据大量的情况下,用gets读取快于s

scanf和gets读取字符串

最关键的是scanf返回值是整数型,while(scanf()!=EOF) 而gets返回的是指针while(gets()!=NULL) 1. scanf 函数是有返回值的,它的返回值可以分成三种情况  1) 正整数,表示正确输入参数的个数.例如执行 scanf("%d %d", &a, &b);       如果用户输入"3 4",可以正确输入,返回2(正确输入了两个变量):      如果用户输入"3,4",可以正确输入a,无

关于C中scanf()函数读取字符串的问题

1 #include <stdio.h> 2 3 int main(void) 4 { 5 char s_name[20]; 6 7 scanf("%s", s_name); 8 printf("Hello, %s!\n", s_name); 9 10 return 0; 11 } 对于这段简单的代码,如果输入一个名字如:Stephen,很容易知道,其输出为: Hello, Stephen! 这个很容易理解,但是输入更完整的名字如:Stephen Pra

字符串常量与字符串数组区别

在论坛上看到过有人说字符串常量存储在只读区域,不能写只能读: 而字符数组是栈上,可读可写. #include<stdio.h> #include<stdarg.h> int main(){ /*字符数组存储于动态内存中,可以进行赋值操作*/ char message[]={'h','e','l','l','\0'}; message[2]='a'; printf("%s\n",message); /*指向字符数组的指针也可以对内存进行操作*/ char *p=m

A + B------HDOJ杭电1228(读取字符串练基础)

Problem Description 读入两个小于100的正整数A和B,计算A+B. 需要注意的是:A和B的每一位数字由对应的英文单词给出. Input 测试输入包含若干测试用例,每个测试用例占一行,格式为"A + B =",相邻两字符串有一个空格间隔.当A和B同时为0时输入结束,相应的结果不要输出. Output 对每个测试用例输出1行,即A+B的值. Sample Input one + two = three four + five six = zero seven + eig

c++名字空间,C与C++字符串的区别,枚举类型

1:命名空间2:C与C++字符串的区别和基本操作3:枚举类型命名空间#include <string> #include <ctype.h> #include <vector> #include <iostream> #include <fstream> // using declarations states our intent to use these names from the namespace std using namespace

Oracle中Null与空字符串&#39; &#39;的区别

含义解释: 问:什么是NULL? 答:在我们不知道具体有什么数据的时候,也即未知,可以用NULL,我们称它为空,ORACLE中,含有空值的表列长度为零. ORACLE允许任何一种数据类型的字段为空,除了以下两种情况: 1.主键字段(primary key), 2.定义时已经加了NOT NULL限制条件的字段 说明: 1.等价于没有任何值.是未知数. 2.NULL与0.空字符串.空格都不同. 3.对空值做加.减.乘.除等运算操作,结果仍为空. 4.NULL的处理使用NVL函数. 5.比较时使用关键

java基础---&gt;文件---&gt;从标准输入读取字符串作为文件名----&gt;解决“文件名乱码”问题

概述:程序中有时会需要从标准输入读取字符串作为文件的名字,其具体实现方法有许多种.我第一次尝试编写这方面的程序时遇到了"乱码问题",后来使用了新的写法解决了乱码问题. /*原码,使用这种方法编写的代码会出现"乱码问题" 乱码原因分析:从标准输入读取的数据先被存放至byte[]中,之后又将byte数组转成String,这个过程中就会出现编码不一致的问题 如标准输入"file1",但是最终fileName=buffer.toString()的结果却是