杭电HDU-2017

字符串统计
杭电HDU
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 112444 Accepted Submission(s): 61578

Problem Description

对于给定的一个字符串,统计其中数字字符出现的次数。

Input

输入数据有多行,第一行是一个整数n,表示测试实例的个数,后面跟着n行,每行包括一个由字母和数字组成的字符串。

Output

对于每个测试实例,输出该串中数值的个数,每个输出占一行。

Sample Input

2
asdfasdf123123asdfasdf
asdf111111111asdfasdfasdf

Sample Output

6
9

Author

lcy

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
int main()
{
	char a[1000];
	int n;
	scanf("%d", &n);//测试个数
	getchar();//吃掉输入n剩下的回车字符
	while (n--)
	{
		int num = 0;
		gets(a);
		int l = strlen(a);//数组长度
		for (int i = 0; i < l; i++)
		{
			if (a[i] >= '0'&&a[i] <= '9')//依据题意要求检测数字
				num++;
		}
		printf("%d\n", num);
	}
	return 0;
}




#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
int main()
{
	char a[1000];
	int n;
	scanf("%d", &n);//测试个数
	while (n--)
	{
		int num = 0;
		scanf("%s", a);
		int l = strlen(a);//数组长度
		for (int i = 0; i < l; i++)
		{
			if (a[i] >= '0'&&a[i] <= '9')//依据题意要求检测数字
				num++;
		}
		printf("%d\n", num);
	}
	return 0;
}

关于getchar()吃掉垃圾字符的情况
首先需要弄清楚gets和scanf、getchar从缓冲区中读入数据的方式。
程序的输入都建有一个缓冲区,即输入缓冲区。一次输入过程是这样的,当一次键盘输入结束时会将输入的数据存入输入缓冲区。
下面先看一个很简单的程序:
程序1:
#include <stdio.h>
int main()
{
char ch1, ch2;
scanf(“%c”, &ch1);
scanf(“%c”, &ch2);
printf(“%d %d\n”, ch1, ch2);
return 0;
}

或者是:
#include <stdio.h>
int main()
{
char ch1, ch2;
ch1 = getchar();
ch2 = getchar();
printf(“%d %d\n”, ch1, ch2);
return 0;
}

程序的本意很简单,就是从键盘读入两个字符,然后打印出这两个字符的ASCII码值。
输入a按下回车
输出97 10

【分析】

首先我们呢看一下输入操作的原理,程序的输入都建有一个缓冲区,即输入缓冲区。一次输入过程是这样的,当一次键盘输入结束时会将输入的数据存入输入缓冲区,而scanf函数直接从输入缓冲区中取数据。正因为scanf函数是直接从缓冲区取数据的,所以有时候当缓冲区中有残留数据时,scanf函数会直接取得这些残留数据而不会请求键盘输入,这就是例子中为什么会出现输入语句失效的原因!

其实这里的10恰好是回车符(在linux系统中,enter键输入的回车符即’\n’,也称换行符)!这是因为scanf()和getchar()函数是从输入流缓冲区中读取值的,而并非从键盘(也就是终端)缓冲区读取。而读取时遇到回车(\n)而结束的,这个\n会一起读入输入流缓冲区的,所以第一次接受输入时取走字符后会留下字符\n,这样第二次的读入函数直接从缓冲区中把\n取走了,显然读取成功了,所以不会再从终端读取!这就是为什么这个程序只执行了一次输入操作就结束的原因!
scanf读取数据方式:
scanf会读取并忽略在stdin中下一个非空白字符之前的所有空白字符(空格、换行和tab),然后读取format string中规定格式的数据。
scanf()函数取数据(从输入缓冲区取)时遇到回车(linux 回车符’\n’)、空格、TAB就会停止,

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
int main()
{
	char a[10],b[10];
	scanf("%s", a);
	printf("%s\n", a);
	scanf("%s", b);
	printf("%s\n", b);
	system("pause");
	return 0;
}

输入 hello
输出 hello
输入 word
输出 word
分析:
程序执行了两次从键盘读入字符串,说明第一次输入结束时的回车符被丢弃!即:scanf()读取字符串会舍弃最后的回车符(即回车符不会残留在缓冲区中)!

总结:
1. 读取字符时: scanf()以Space、Enter、Tab结束一次输入,不会舍弃最后的回车符(即回车符会残留在缓冲区中); getchar()以Enter结束输入,也不会舍弃最后的回车符; 2. 读取字符串时: scanf()以Space、Enter、Tab结束一次输入,不舍弃最后的回车符。 gets()以Enter结束输入(空格不结束),接受空格,会舍弃最后的回车符! 3.scanf读入(非字符)数据从缓存区非空白字符开始读入,读到空白字符为止。 4.getchar(),gets()会读入缓存区残留的回车符5.puts()函数用来向标准输出设备(屏幕)输出字符串并换行,具体为:把字符串输出到标准输出设备,将’\0’转换为回车换行。

点赞