【转】C语言中字符串输入的三种方法
在网上看到,讲的还算详细,转过来学习一下。。。。。。
=======================================================================
使用C语言编写程序时,很多时候需要处理从标准输入输入的字符串。理论上讲有三种方法:
scanf("%s",in_buff);
gets(in_buff);
fgets(in_buff,BUFFER_SIZE + 1,stdin);
其中in_buff为一个char指针或者char数组名,BUFFER_SIZE为一个常量,stdin为标准输入。
首先要解决的问题是in_buff应为一个char指针,还是应该作为一个char数组名。如果in_buff作为一个char指针,那么在从标准 输入读取数据时,将无法确定要读取的字节数。这是一个著名的漏洞,当用户输入超出函数使用的数组范围时将造成缓冲区溢出。因此,不能将in_buff定义 为一个char指针,而要定义为一个数组名。比如
#define BUFFER_SIZE 10
// ...
char in_buff[BUFFER_SIZE + 1]; // +1 是为了存放字符串结尾符
那么,应该使用上面列出的三个函数中的哪个函数来接收从标准输入输入的数据呢。
当使用scanf函数时,如果在数组范围内有空格,那么第一个空格之后的字符将被忽略,这通常不是我们想要的。另外,scanf函数也不提供对写入数组的数据是否越界的检查。
当使用gets函数时,由于gets不提供对写入数组的数据进行是否越界的检查,所以也不安全。
而使用fgets函数时,只要第二个参数正好等于第一个参数传给它的数组的字节个数,那么fgets函数不会写出数组边界。所以,fgets函数是最好的选择。
例:输入一字符串,将其按降序输出(用VC++6.0调试通过)(偶提供的 ^_^)。
#include<stdio.h>
#include<string.h>
#define BUFFER_SIZE 255
void sortStr(char *str)
{
int len = strlen(str);
char t1,t2,t;
for(int i=0;i<len-2;i++)
{
t1 = *(str+i);
for(int j=len-1;j>i;j--)
{
t2=*(str+j);
if(t1<t2)
{
t=*(str+i);
*(str+i) = *(str+j);
*(str+j) = t;
}
}
}
}
void main()
{
char str[BUFFER_SIZE + 1];
printf("Please Enter A String!\n");
fgets(str,BUFFER_SIZE + 1,stdin);
sortStr(str);
printf("Sort Result:%s\n",str);
}
==========================================================================
ps:很多时候输入字符串的时候,gets会显示不安全。。。scanf不能吸收空格,所以这时候fgets就可以派上用场了,哈哈。。。
【转】C语言中字符串输入的三种方法的更多相关文章
- Shell中字符串分割的三种方法
问题:对于’1,2,3,4,5’这样的字符串输出采用,分隔开的1 2 3 4 5 特征:在字符串中没有空格 解决方法1: #!/bin/bash var=’1,2,3,4,5’ var=${var// ...
- C语言中最常用的三种输入输出函数scanf()、printf()、getchar()和putchar()
本文给大家介绍C语言中最常用的三种输入输出函数scanf().printf().getchar()和putchar(). 一.scanf()函数格式化输入函数scanf()的功能是从键盘上输入数据,该 ...
- Android中全屏 取消标题栏,TabHost中设置NoTitleBar的三种方法(转)
Android中全屏 取消标题栏,TabHost中设置NoTitleBar的三种方法http://www.cnblogs.com/zdz8207/archive/2013/02/27/android- ...
- Openerp 中打开 URL 的三种 方法
来自:http://shine-it.net/index.php/topic,8013.0.html 最近总结了,Openerp 中打开 URL 的三种 方法: 一.在form view 添加 < ...
- mysql 中添加索引的三种方法
原文:http://www.andyqian.com/2016/04/06/database/mysqleindex/ 在mysql中有多种索引,有普通索引,全文索引,唯一索引,多列索引,小伙伴们可以 ...
- jQuery中detach&&remove&&empty三种方法的区别
jQuery中empty&&remove&&detach三种方法的区别 empty():移除指定元素内部的所有内容,但不包括它本身 remove():移除指定元素内部的 ...
- [Python]实现字符串倒序的三种方法
a=" 1: print(a[::-1]) 2: b=list(a) b.reverse() print(''.join(b)) 3: c=len(a)-1 str_1=[] while(c ...
- R语言中样本平衡的几种方法
R语言中样本平衡的几种方法 在对不平衡的分类数据集进行建模时,机器学习算法可能并不稳定,其预测结果甚至可能是有偏的,而预测精度此时也变得带有误导性.在不平衡的数据中,任一算法都没法从样本量少的类中获取 ...
- python字符串连接的三种方法及其效率、适用场景详解
python字符串连接的方法,一般有以下三种:方法1:直接通过加号(+)操作符连接website=& 39;python& 39;+& 39;tab& 39;+& ...
随机推荐
- Codeforces 1082 G - Petya and Graph
G - Petya and Graph 思路: 最大权闭合子图 对于每条边,如果它选了,那么它连的的两个点也要选 边权为正,点权为负,那么就是求最大权闭合子图 代码: #pragma GCC opti ...
- 非常好的 gdb tui 的文章
http://beej.us/guide/bggdb/ Help Commands help command Get help on a certain command apropos keyword ...
- [jQuery] 判断复选框checkbox是否选中checked
返回值是true/false method 1: $("#register").click(function(){ if($("#accept").get(0) ...
- 如何在Virtualbox中对Ubuntu系统根分区扩容
转载: 参见博客: https://blog.csdn.net/LEON1741/article/details/56494797 前在Virtualbox中安装了一个Ubun ...
- 如何启动iis(Internet 信息服务(IIS)管理器)
Internet 信息服务(IIS)管理器 启动 IIS 管理器1.从“开始”菜单,指向“管理工具”,然后单击“Internet 信息服务 (IIS) 管理器”. 从“运行”对话框启动 IIS 管理器 ...
- change_bit 按位取反
int change_bit(int nr, void * addr){ int oldbit; //1.第nr位取反, 原nr位入CF //2. sbbl带借位减(把源操作数和标志 ...
- Confluence 6 创建一个空间
在 Confluence 中并不限制你可以创建多少空间.你可以选择为你每一个小组,项目都创建一个空间,或者你也可以将这 2 者混合在一起.所有的这些都基于你的需求来决定的. 每一个 Confluenc ...
- Vrrp和Hsrp的区别
VRRP原理协议简述简单来说,VRRP是一种容错协议,它为具有组播或广播能力的局域网(如以太网)设计,它保证当局域网内主机的下一跳路由器出现故障时,可以及时的由另一台路由器来代替,从而保持通讯的连续性 ...
- 查看cookie的快捷方法
1.url中输入数字+javascript:alert(document.cookie) 如:2javascript:alert(document.cookie) ,然后在浏览器中去掉2,回车 ...
- STLC - 软件测试生命周期
什么是软件测试生命周期(STLC)? 软件测试生命周期(STLC)定义为执行软件测试的一系列活动. 它包含一系列在方法上进行的活动,以帮助认证您的软件产品. 图 - 软件测试生命周期的不同阶段 每个阶 ...