您的当前位置:首页正文

C语言字符串读入

来源:个人技术集锦
c中字符串输入的3种方法

(2008-04-04 12:46:03) 转载▼ 标签:

杂谈

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

使用C语言编写程序时,很多时候需要处理从标准输入输入的字符串。理论上讲有三种方法:

scanf(\"%s\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 #include

#define BUFFER_SIZE 255

void sortStr(char *str) {

int len = strlen(str); char t1,t2,t;

for(int i=0;it1 = *(str+i);

for(int j=len-1;j>i;j--) {

t2=*(str+j); if(t1t=*(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\}

因篇幅问题不能全部显示,请点此查看更多更全内容