gets()函数不能控制输入的长度,例如

  char str[100];

  gets(str);

如果用户输入10000个字符,情况会怎样呢?很显然,数组越界,程序很可能会崩溃,并且还有受到恶意输入导致遭受溢出攻击的风险。

可用的替代函数是 fgets, 原型类似于

  char * fgets(const char *str, unsigned maxlen, FILE *fp);

例如  fgets(str, 100, stdin); 这样可以限制,输入的字符(包括末尾的'\0')不会超过100个,可以放心使用。

但是该函数与gets另一个不同的地方是,用户输入的回车并不会被吃掉,而是会原样存放在字符串中,需要特别注意。

p.s. 上面给出的例子中, stdin 是C语言预定义的一个 FILE * 类型的变量,对应于“标准输入”,默认情况下就是来自键盘的输入。


利用字符串的值作为数组下标,实现字符出现次数的统计


#include<stdio.h>
 #include<stdlib.h>
 #include<string.h>
 int main(){
     char words[10],str[1010];
     char count[256];//ASCII码
     int i; 
     while(1){
         fgets(words,10,stdin);
         fgets(str,1010,stdin);
         if(words[0]=='#') 
             break;
         for(i=0;i<256;i++)
             count[i]=0;
         for(i=0;str[i];i++){
             count[str[i]]++;
         }
         for(i=0;words[i];i++)
             if(words[i]!='\r'&&words[i]!='\n')
                 printf("%c %d\n", words[i], count[words[i]]);
     }
     return 0;
 }