WOJ:Starter:1046 - BONUS#4 - 统计字符
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;
}