【转】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;+& ...
随机推荐
- 日常英语---二、注册google的api的key
日常英语---二.注册google的api的key 一.总结 一句话总结:register google api key register_google_api_key 1.请通过电子邮件向我发送有关 ...
- Use GDB to debug a C++ program called from a shell script
解决了我一个大问题!!! http://stackoverflow.com/questions/5048112/use-gdb-to-debug-a-c-program-called-from-a-s ...
- Android Error:Could not find lottie.jar
Android Error:Could not find lottie.jar 今天遇到了一个及其头疼的问题 同事的工程导到我的电脑里却报错,错误是找不到jcenter仓库里的lottie.jar包 ...
- Confluence 6 空间中的常用宏
小组空间(Team Spaces): 介绍小组:User Profile Macro 将会对 Confluence 的用户显示属性的简单摘要,属性照片,联系方式. 在你小组中分享通知和新闻:The B ...
- 3 爬虫解析 Xpath 和 BeautifulSoup
1.正则表达式 单字符: . : 除换行以外所有字符 [] :[aoe] [a-w] 匹配集合中任意一个字符 \d :数字 [-] \D : 非数字 \w :数字.字母.下划线.中文 \W : 非\w ...
- MySQL事务(三)
一.事务(Innodb锁)的隔离级别概述 并发事务带来的问题: 更新丢失(lost update):当两个或多个事务选择同一行,然后基于最初选定的值更新该行时,由于每个事务都不知道其他事务的存在,就会 ...
- 用vivado实现4比特加法器
`timescale 1ns / 1ps module add_4_beha( a, b, cin, sum ); :] a; :] b; input cin; output sum; :]a; :] ...
- 安卓——AppTheme
<?xml version="1.0" encoding="utf-8"?> <resources> <style name=&q ...
- c++中利用localtime_s函数格式化输出当地日期与时间
Visual C++ 6.0开发环境中显示当地日期与时间主要通过localtime()函数来实现,该函数的原型在time.h头文件中,其语法格式如下: struct tm *localtime(xon ...
- UI基础一:值节点赋值
METHOD EH_ONSEARCH. *CALL METHOD SUPER->EH_ONSEARCH ** EXPORTING ** HTMLB_EVENT = ** HTMLB_EVENT_ ...