【转】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就可以派上用场了,哈哈。。。