scanf和gets输入字符串区别分析 您所在的位置:网站首页 用scanf函数输入字符串时不能有什么 scanf和gets输入字符串区别分析

scanf和gets输入字符串区别分析

2023-03-18 22:48| 来源: 网络整理| 查看: 265

1.scanf输入字符串解析

直接上代码,如下所示:

1 #include 2 #include 3 int main(int argc, char *argv[]) 4 { 5 char str[100]; 6 // gets(str); 7 scanf("%s",str); 8 printf("输入的字符串为:\n"); 9 printf("%s\n",str); 10 //打印字符串最后一个数据(结束符\0前面一个) 11 printf("最后一个字符为:%c\n",str[strlen(str)-1]); 12 //输入结束打印后再次读取缓冲区数据 13 printf("请再次输入\n"); 14 printf("读取打印缓冲区数据:%x\n",getchar()); 15 return 0; 16 }

只需要输入1次即可得到代码的执行结果,如下图所示:

fly@fly-virtual-machine:~/test$ ./2 11111 输入的字符串为: 11111 最后一个字符为:1 请再次输入 读取打印缓冲区数据:a fly@fly-virtual-machine:~/test$

从上述代码执行结果可以看出,打印最后一个字符‘1’之后,再次使用getchar获取输入缓冲区的内容得到的十六进制结果0x0a,其对应的ASCII表中的‘\r’(关于回车对应的ASCII是\r还是\n等结果请自行百度查看其区别)。从执行结果可以看出,scanf并未将输入缓冲区数据全部读取,当执行到getchar时,因为输入缓冲区存在数据,并不需要我们从键盘再次数据内容,程序即可执行结束。如果我们输入“111+空格+1”时会是怎么样呢?下图是程序执行结果:

111 1 输入的字符串为: 111 最后一个字符为:1 请再次输入 读取打印缓冲区数据:20 fly@fly-virtual-machine:~/test$

此时读取到str中的字符串为“111”,执行getchar获取的数据为space对应的ASCII码值,此时输入缓冲区后续还存在字符‘1’和回车,程序未进一步读取测试。若上次输入中的空格改成“111+TAB+1”,执行结果中str任然只有“111”,getchar获取输入缓冲区的数据应该为tab键对应的ASCII码值0x09,程序执行结果如下图所示:

fly@fly-virtual-machine:~/test$ ./2 111 1 输入的字符串为: 111 最后一个字符为:1 请再次输入 读取打印缓冲区数据:9 fly@fly-virtual-machine:~/test$

从上述三次测试结果可以看出,sacnf输入时遇到空格,tab或者回车时会终止输入,后续输入内容不会读取到变量中(包含输入结束符空格,tab或者回车),只会存在数据输入缓冲区中等待进一步读取,可以使用getchar,scanf或者gets函数进行获取。

gets输入字符串解析

将上述代码中的scanf输入更改为gets输入,代码如下所示:

1 #include 2 #include 3 int main(int argc, char *argv[]) 4 { 5 char str[100]; 6 gets(str); 7 // scanf("%s",str); 8 printf("输入的字符串为:\n"); 9 printf("%s\n",str); 10 //打印字符串最后一个数据(结束符\0前面一个) 11 printf("最后一个字符为:%c\n",str[strlen(str)-1]); 12 //输入结束打印后再次读取缓冲区数据 13 printf("请再次输入\n"); 14 printf("读取打印缓冲区数据:%x\n",getchar()); 15 return 0; 16 }

执行结果如下图所示:

fly@fly-virtual-machine:~/test$ ./2 11111 最后一个字符为:1 请再次输入

代码运行时,第一次输入“11111”字符串之后,此时终端提示再次输入内容,后续输入‘2’之后执行结果如下图所示:

fly@fly-virtual-machine:~/test$ ./2 11111 最后一个字符为:1 请再次输入 2 读取打印缓冲区数据:32 fly@fly-virtual-machine:~/test$

分析上述代码可知,gets函数从输入缓冲区获取输入内容之后,输入缓冲区此时为空,即回车的内容被gets函数读取了,但是并未赋值到str中,当执行到getchar时,需要用户在终端再次从键盘上输入内容。下面展示分别输入“111+空格+1”和“111+TAB+1”的执行结果。 输入“111+空格+1”执行结果:

fly@fly-virtual-machine:~/test$ ./2 111 1 输入的字符串为: 111 1 最后一个字符为:1 请再次输入 2 读取打印缓冲区数据:32 fly@fly-virtual-machine:~/test$

输入“111+TAB+1”执行结果:

fly@fly-virtual-machine:~/test$ ./2 111 1 输入的字符串为: 111 1 最后一个字符为:1 请再次输入 2 读取打印缓冲区数据:32 fly@fly-virtual-machine:~/test$

分析上述三次测试,gets函数读取到回车结束符后,执行后续的打印函数;当执行到getchar时,此时输入数据缓冲区无内容,所以程序在等待我们从键盘上输入,输入之后程序才会彻底结束。得出如下结论:gets把空格和tab作为字符读取且并不会导致读取结束,遇到回车键时才会停止并且回车键并不会保存在数据缓冲区中。

结论

scanf和gets函数均可实现字符串的输入,但是scanf遇到空格 tab或者回车就会结束输入,结束符以及后续输入内容保存在输入数据缓冲区中;gets输入时,空格和tab键均作为字符读取且不会造成读取结束,gets执行结束后输入数据缓冲区中无输入结束符。但是gets函数使用上存在风险。gets如果没有遇到回车会持续读取数据,设计程序是应保证字符串长度足够大,防止数据溢出造成严重后果。



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有