加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

c中字符串输入的3种方法

(2008-04-04 12:46:03)
标签:

杂谈

    网上看到的,觉得不错,转过来学习一下。
   

使用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);
}

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有