C/C++ scanf函数中%s和%c的简单区别

首先声明:在键盘中敲入字符后,字符会首先保存在键盘缓冲区中供scanf函数读取(scanf,getchar等函数是读取缓冲区,getch函数是读取的控制台信息,即为直接从键盘读取)。另外特别注意键盘上敲入回车实际为“\r\n”,但存储到缓冲区时候会舍弃‘\r’而只存储\n.例如我们敲入字符“12345回车”,缓冲区内存储的为“12345\n”.

文章中“_”代表空格

代码:

char *s;

scanf("%s",s);

printf("%s\n",s);

scanf("%s",s);

printf("%s\n",s);

例:

输入:123_345回车            “_”代表空格

输出:123

345

分析:对于scanf以%s格式输入时候,“空格、换行符、TAB”等是作为两个数据的分隔符存在的,即分隔符前后是两个数据,读入时候分隔符不读入。

例:

输入:123回车

456回车

输出:123

456

原因:如事例1,输入123回车后,缓冲区内存的是123\n,第一次读入后,缓冲区内只剩余了\n,当第二次读入时候,\n是以分隔符存在的,不读入第二次的是,故缓冲区中是没有数据存在的,所以需要继续输入数据。

例:

输入:_回车                     “_”代表空格

这种输入会要求一直输入,这是因为空格和\n都是分隔符,没有数据,所以没办法读入。同样直接输入回车也是一直要求输入

代码:

char *s;

scanf("%s",s);

printf("%s\n",s);

scanf("%c",s);

printf("%d\n",*s);

例:

输入:1234_12回车                     “_”代表空格

输出:1234

32(空格的ASCII为32)

原因:对于第一个%s读入时遇到分隔符“空格”就停止,但是空格还是保存在缓冲区的。对于%c读入时候,“空格、\n、TAB”等是正常字符,所以第二次读入时候读取缓冲中的第一个字符“空格”,所以输出的是32.

事例2:

输入:123回车

输出:123

10(\n的ASCII为10)

原因:%s读入后缓冲中指剩下了\n故第二次以%c读入时候就读入了\n,输出为10.

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-13 22:01:11

C/C++ scanf函数中%s和%c的简单区别的相关文章

scanf()函数中*的用法

*在scanf函数中提供完全不同的服务,当把它放在%和说明符字母之间时,它使函数跳过相应的输入项目. 实例程序: /*scanf()函数中*的用法:如果程序要读取一个文件中某个特定的列(该文件中的数据以统一的列排列时,那么该功能将非常有用)*/ #include <stdio.h> int main() { int n; printf("please input four numbers:\n"); scanf("%*d %*d %*d %d",&

关于scanf函数中取地址的问题

这几天学了指针与地址之后,突发奇想. 1 #include <stdio.h> 2 int main() 3 { 4 int a,b,*pa,*pb; 5 pa = &a; 6 pb = &b; 7 scanf("%d %d",pa,pb); 8 printf("%d %d\n",a,b); 9 return 0; 10 } 既然scanf中&a与&b可以用指向它们地址的指针pa与pb来代替,那么是否可以通过查询变量a与b

scanf()函数

函数名: scanf 功  能: 执行格式化输入 用  法: int scanf(char *format[,argument,...]); scanf("格式控制字符串",输入参数一,输入参数二) 格式控制字符串表示输入的格式:(int型用%d,float用%f,double型用%lf) %d 十进制有符号整数  %u 十进制无符号整数  %f 浮点数  %s 字符串  %c 单个字符  %p 指针的值  %e 指数形式的浮点数  %x, %X 无符号以十六进制表示的整数  %0 无

scanf函数详细讲解

(1)简介: scanf函数是c语言当中非常重要的格式化输入函数 其函数原型为:int scanf(const char *format, ...); 其函数返回值:成功格式化解析的个数 其调用格式为:scanf("<格式化字符串>", <参量表>); (2)转换说明: 转换格式为:%[*][宽度][类型长度]类型 除了最后的类型之外都是可选的字段 转换修饰符 修饰符 意义 * 滞后赋值:示例:"%*d" digit(s) z最大字段宽度:在

scanf函数简单讲解

在C语言中,scanf函数用来接收控制台输入的数据,包括数字.字符.汉字.字母等.其首先将从键盘或触摸屏接收到的数据存放到内存中,然后严格按照scanf函数中""的内容将相应的数据存到""后面的地址中(如&a是将相应的数据存到以&a为地址的内存中).scanf函数中的""内容分为非格式控制符(如符号等)和格式控制符(如%d.%c.%f.%lf等).非格式控制符必须原样输入(\n的输入不是按Enter键,而是输入\n),格式控制符会

scanf函数(初学者)

scanf函数称为格式输入函数,即按用户指定的格式从键盘上把数据输入到指定的变量之中. 1.scanf函数的一般形式:scanf函数是一个标准的库函数,它的函数原型在头文件"stdio.h"中,与printf函数相同,C语言也允许在使用scanf函数之前不必包含stdio.h文件. scanf函数的一般形式为:scanf("格式控制字符串",地址列表): 其中,格式控制字符串的作用与printf函数相同,但不能显示非格式字符串,也就是不能显示提示字符串.地址列表中给

while循环中使用scanf函数

妈的,这scanf函数学了快10年了,怎么还会出现莫名其妙的问题?看下面的代码(VS2012环境下运行): #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> int main() { char root_value = '\0'; int i =1; while (i!=5) { printf("输入:"); scanf("%c",&root_value);//用户输入节点 i++; } prin

C++中的gets()函数和scanf()函数

gets()函数和scanf()函数, 两者在接受字符串时: 1.不同点: scanf不能接受空格.制表符Tab.回车等: 而gets能够接受空格.制表符Tab和回车等: 2.相同点: 字符串接受结束后自动加'\0'. scanf :当遇到回车,空格和tab键会自动在字符串后面添加'\0',但是回车,空格和tab键仍会留在输入的缓冲区中. gets:可接受回车键之前输入的所有字符,并用'\n'替代 '\0'.回车键不会留在输入缓冲区中 gets()用到读取字符串,用回车结束输入 scanf()可

vs2013/2015中scanf函数类似于error C4996: &#39;scanf&#39;: This function or variable may be unsafe的安全检查错误

在使用vs2015时,遇到了scnaf函数安全性的问题,程序不能正常运行,错误如下: error C4996: 'scanf': This function or variable may be unsafe. Consider using scanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details. 经调试,发现这个错误的原因是:scanf等类似的函数已经不太