在网上看到,讲的还算详细,转过来学习一下。。。。。。

=======================================================================

使用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语言中字符串输入的三种方法的更多相关文章

  1. Shell中字符串分割的三种方法

    问题:对于’1,2,3,4,5’这样的字符串输出采用,分隔开的1 2 3 4 5 特征:在字符串中没有空格 解决方法1: #!/bin/bash var=’1,2,3,4,5’ var=${var// ...

  2. C语言中最常用的三种输入输出函数scanf()、printf()、getchar()和putchar()

    本文给大家介绍C语言中最常用的三种输入输出函数scanf().printf().getchar()和putchar(). 一.scanf()函数格式化输入函数scanf()的功能是从键盘上输入数据,该 ...

  3. Android中全屏 取消标题栏,TabHost中设置NoTitleBar的三种方法(转)

    Android中全屏 取消标题栏,TabHost中设置NoTitleBar的三种方法http://www.cnblogs.com/zdz8207/archive/2013/02/27/android- ...

  4. Openerp 中打开 URL 的三种 方法

    来自:http://shine-it.net/index.php/topic,8013.0.html 最近总结了,Openerp 中打开 URL 的三种 方法: 一.在form view 添加 < ...

  5. mysql 中添加索引的三种方法

    原文:http://www.andyqian.com/2016/04/06/database/mysqleindex/ 在mysql中有多种索引,有普通索引,全文索引,唯一索引,多列索引,小伙伴们可以 ...

  6. jQuery中detach&&remove&&empty三种方法的区别

    jQuery中empty&&remove&&detach三种方法的区别 empty():移除指定元素内部的所有内容,但不包括它本身 remove():移除指定元素内部的 ...

  7. [Python]实现字符串倒序的三种方法

    a=" 1: print(a[::-1]) 2: b=list(a) b.reverse() print(''.join(b)) 3: c=len(a)-1 str_1=[] while(c ...

  8. R语言中样本平衡的几种方法

    R语言中样本平衡的几种方法 在对不平衡的分类数据集进行建模时,机器学习算法可能并不稳定,其预测结果甚至可能是有偏的,而预测精度此时也变得带有误导性.在不平衡的数据中,任一算法都没法从样本量少的类中获取 ...

  9. python字符串连接的三种方法及其效率、适用场景详解

    python字符串连接的方法,一般有以下三种:方法1:直接通过加号(+)操作符连接website=& 39;python& 39;+& 39;tab& 39;+& ...

随机推荐

  1. Corrupted Metadata/failed to mount /sysroot

    公司电脑CentOS系统突然断电,开机后,无法进入系统.查看系统log如下: mount: mount /dev/mapper/cl-root on /sysroot failed:Structure ...

  2. 第 8 章 容器网络 - 050 - 创建 overlay 网络

    在 host1 中创建 overlay 网络 ov_net1: docker network create -d overlay ov_net1 -d overlay 指定 driver 为 over ...

  3. 虚拟机vmnet0、vmnet1和vmnet8的区别

    vmnet0,实际上就是一个虚拟的网桥 vmnet0,实际上就是一个虚拟的网桥,这个网桥有很若干个端口,一个端口用于连接你的Host,一个端口用于连接你的虚拟机,他们的位置是对等的,谁也不是谁的网关. ...

  4. VMware安装Linux并配置网络通信

    说明: Linux系统:CentOS-6.8-x86_64-minimal.iso VMware版本:9.0 首先下载VMware并安装.然后将CentOS-6.8-x86_64-minimal.is ...

  5. 《SQL 基础教程》—第一章:数据库与 SQL

    导言 这一章的内容如下: 数据库简介 SQL 概要 表的创建 表的删除与更新 数据库简介 定义: Database, 是大量数据的集合Database Management System,是用于管理数 ...

  6. 雷林鹏分享:C# 运算符

    C# 运算符 运算符是一种告诉编译器执行特定的数学或逻辑操作的符号.C# 有丰富的内置运算符,分类如下: 算术运算符 关系运算符 逻辑运算符 位运算符 赋值运算符 杂项运算符 本教程将逐一讲解算术运算 ...

  7. android -------- android studio 中设置创建类时的说明信息(包含 作者 ,创建时间,注释说明等)

    今天简单来说一下android studio开发工具中的 一个小设置功能: 在开发过程中我们习惯给新建的类添加一些注释信息,创建日期.时间和作者等. 设置信息 File—>Settings—&g ...

  8. Django的form组件

    forms组件 forms组件,是一个类.在视图函数中创建一个类,类需要继承forms.Form from django import  forms 1.校验数据 步骤和语法: 1. 创建一个form ...

  9. 59 Cookie 与 Session

    Cookie Cookie是由服务器创建,然后通过响应发送给客户端的一个键值对. 客户端会保存Cookie,并会标注出Cookie的来源(哪个服务器的Cookie). 当客户端向服务器发出请求时会把所 ...

  10. CF1129C Morse Code

    pro: 维护一个01字符串,支持在结尾动态加字符. 每一个长度<=4的01串可以对应一个字母(有几个特例除外) 每次操作后询问,这个字符串的所有子串一共可以对应出多少种本质不同的字符串. so ...