NOIP-----2018-----普及组-----标题统计

题目描述
凯凯刚写了一篇美妙的作文,请问这篇作文的标题中有多少个字符?注意:标题中可能包含大、小写英文字母、数字字符、空格和换行符。统计标题字符数时,空格和换行符不计算在内。
输入格式:
输入只有一行,一个字符串 s。
输出格式:
输出只有一行,包含一个整数,即作文标题的字符数(不含空格和换行符)。
输入输出样例:
输入样例#1:
234
输出样例#1:
3
输入样例#2:
Ca 45
输出样例#2:
4
说明:
【输入输出样例 1 说明】
标题中共有 3 个字符,这 3 个字符都是数字字符。
【输入输出样例 2 说明】

标题中共有4个字符,包括1个大写英文字母,1个小写英文字母和2个数字字符,还有1个空格。由于空格不计入结果中,故标题的有效字符数为4个。

【数据规模与约定】
规定∣s∣表示字符串 s 的长度(即字符串中的字符和空格数)。
对于 40% 的数据,1≤∣s∣≤5,保证输入为数字字符及行末换行符。
对于 80% 的数据,1≤∣s∣≤5,输入只可能包含大、小写英文字母、数字字符及行末换行符。
对于 100% 的数据,1≤∣s∣≤5,输入可能包含大、小写英文字母、数字字符、空格和行末换行符。

 

第一次做的时候,时间超限(95分)……

下面是代码:

 

(时间超限95)C++代码

 

#include <bits/stdc++.h>
using namespace std;
int main()
{
char a;
int ans=0;
while(cin.peek()!='\n') //扫一下新输入的字符是不是换行字符
{
cin>>a;
if(a!=' ')ans++;
}
cout<<ans<<endl;
return 0;
}

 

所以接着尝试……

同学告诉我,简单一点做,所以:

 

(答案错误90)C++代码

#include <bits/stdc++.h>
using namespace std;
int main()
{
char a[6];
int ans=0,len;
gets(a);
len=strlen(a);
for(int i=1;i<=len;i++)
if(a[i]!=' ')ans++;
cout<<ans<<endl;
return 0;
}

 

内心绝望!!!

后来**的我终于发现了自己的错误

下面是正确的代码

 

(AC)C++代码

#include <bits/stdc++.h>
using namespace std;
int main()
{
char a[6];
int ans=0,len;
gets(a);//从a[0]开始写入,所以循环从i=0开始
len=strlen(a);
for(int i=0;i<len;i++)
if(a[i]!=' ')ans++;
cout<<ans<<endl;
return 0;
}

 

gets()

gets从标准输入设备读字符串函数,其可以无限读取,不会判断上限,以回车结束读取,所以程序员应该确保buffer(缓冲寄存器)的空间足够大,以便在执行读操作时不发生溢出。——源自360百科&百度百科

头文件:#include<stdio.h>(C)&#include<cstido>(C++)(包含在#include<bits/stdc++.h>中)

gets()和scanf("%s",s)

scanf("%s",s) 输入字符串时,如果输入了空格会认为字符串结束,空格后的字符将作为下一个输入项处理

gets()函数将接收输入的整个字符串直到遇到换行为止

(ps.gets()函数读取到‘\n’于是停止读取,但是它不会把\n包含到字符串里面去。然而,和它配合使用的puts()函数,却在输出字符串的时候自动换行。

 

转载于:https://www.cnblogs.com/meng-de-yu/p/9954022.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值