scanf遇到空前危机
scanf是我们用的最常见的输入函数,但他的弊病是会⾃动过滤空⽩字符,包括空格、制表符、换⾏符。本题需要统计空格的个数,所以scanf不能使用
两个时代新人——gets和getchar
gets是用来输入字符串的,用法是:gets(数组首元素地址);例如:
char ch[5];
gets(ch);
getchar是输入单个字符的,用法是:变量=getchar();例如
char ch;
ch=getchar();
gets解法
#include<stdio.h>
int main()
{
char str[20];
int num_char = 0, num_num = 0, num_blank = 0, num_rest = 0;
gets(str);
int i = 0;
while (str[i]!='\0')
{
if (str[i] >= 'A' && str[i] <= 'Z' || str[i] >= 'a' && str[i] <= 'z')
num_char++;
else if (str[i] <= '9' && str[i] >= '0')
num_num++;
else if (str[i] == ' ')
num_blank++;
else
num_rest++;
i++;
}
printf("%d %d %d %d", num_char, num_num, num_blank, num_rest);
return 0;
}
输入字符串之后,gets自动跟在字符串末尾加一个\0;所以用\0结束循环
getchar解法
#include<stdio.h>
int main()
{
char c;
int num_char = 0, num_num = 0, num_blank = 0, num_rest = 0;
int i = 0;
while (c=getchar()!='\n')
{
if (c >= 'A' && c <= 'Z' ||c >= 'a' &&c <= 'z')
num_char++;
else if (c <= '9' && c>= '0')
num_num++;
else if (c == ' ')
num_blank++;
else
num_rest++;
}
printf("%d %d %d %d", num_char, num_num, num_blank, num_rest);
return 0;
}
getchar是输入单个字符,没有\0,所以用\n终止循环;
而且getchar是给函数,该函数每出现一次,就读取一个字符,例如
printf("输入4个字符");
printf("%c\n",getchar());
printf("%c\n",getchar());
printf("%c\n",getchar());
printf("%c\n",getchar());
运行结果:
输入4个字符as13
a
s
1
3
所以放在while正好可以往后识别单个字符
成果
🆗!!