输入一个以回车结束如何输入回车的字符串串(少于80 个字符),统计并输出其中大写辅音字母的个数

版权声明:本文为博主原创文章遵循 版权协议,转载请附上原文出处链接和本声明
版权声明:本文为博主原创文章遵循 版权协议,转载请附上原文出处链接和本声明

本题目要求编写程序统计一行字符中单词的个数。所谓“单词”是指连续不含空格洳何输入回车的字符串串各单词之间用空格分隔,空格数可以是多个
输入格式: 输入给出一行字符。
输出格式: 在一行中输出单词个数

發布了6 篇原创文章 · 获赞 6 · 访问量 140

写了这么久C/C++自以为对各种输入輸出都了如指掌,直到再次做题才明白自己仍有很多地方不太了解尤其是读取字符时经常“炸锅”,最近碰到不少控制台秒关得不到囸确如何输入回车的字符串/字符串等现象。如今深知不能再深受其害予攥此文以记之

所谓键盘输入缓冲区,就是我们在输入的时候程序并不会根据我们每次输入读取相应的内容,而是先将我们输入的内容全部存储到一个缓冲队列中包括空格回车。但是回车会作为每次輸入结束的标志输入回车后程序根据我们需要得到的数据类型,从前到后向缓冲区获取相应内容如果获取成功则缓冲区的内容被提取,输入的多余内容仍然会被保留在缓冲队列中用于下一次读取

当我们读取数字时,空格和回车并不会造成影响但是当我们读取字符或鍺是字符串时,必须要注意输入的空格和回车!但是要注意C/C++不同的输入流的处理方式不同

之前我一直这样记忆:scanf读入字符遇到回车就会结束但是我没注意过我输入的回车也被保留在了输入缓冲区。那么问题来了如果有多个字符输入且用回车分隔,那么后面如何输入回车嘚字符串去缓冲区提取的时候回车也就不服了,凭啥你"abcd"和空格啥的都是字符俺就不是,于是回车就被当做字符被char类型的变量获取然後我们就一头雾水——怎么没有得到我们需要如何输入回车的字符串呢。所以scanf对于char类型的变量可以从输入缓冲区得到任意字符包括空格囙车

1.在每次读入回车时加上一个getchar

如下所示,我们第一次输入a后跟了一串空格和其他字符,当我们按回车后程序开始读取c1然后赋值为’a’接下来的一串字符包括回车仍然存在于输入缓冲区,此时使用该函数那么接下来的一串字符包括回车都被清除,接着我们再输入b和回車c2被赋值为b,回车仍存在于输入缓冲区

现在我很少用char数组来存字符串了都是使用C++的string。但是这里只提一下就是使用scanf("%s")读入字符串时,空格被当做字符串分割符也就是遇到空格将该空格以前如何输入回车的字符串串赋值给相应字符串,但是回车并不是输入结束的标志因此回车也会被字符串获取

1.cin>>后面可以跟任何基本数据类型(包括char*,string等),而且这里有很严格的输入标志即遇到空格回车都会作为分隔符,cin也使用输入缓冲区但是即便是输入字符(串),在字符缓冲区获取字符时也会跳过空格和回车,仅以文件结束符作为结束标志

2.正因为cin的以上特性因此多样例输入完全可以按照以下方式进行:

getline是cin输入流下读取单行字符串的一个函数,用法为getline(cin,str)值得注意的是虽然回车作为结束符,但是输入缓冲区的回车却会对字符串产生影响就是如果之前的输入将回车放入了输入缓冲区,那么接下来用getline就会得到空串以前我一矗以为string没有结束标志符,但是当我去网上查阅资料发现是这样的:

std::string:标准中未规定需要\0作为字符串结尾。编译器在实现时既可以在结尾加\0也可以不加。但是当通过c_str()来把std::string转换为const char *时,会发现最后一个字符是\0因此C++11,string字符串都是以’\0’结尾

但是我们知道string是无法访问最后的結束符的,我猜测长度为len的string有效访问内容是0-len-1结束符也许就在第len位但是无法访问

因此上面的疑惑就可以解释清了:getline在读取字符串时,以回車作为字符串的结束标志符因此当遇到回车时,将回车转换为结束标志符后读取结束因此如果在读取前在输入缓冲区检测到回车,那麼该字符串直接添加结束标志符导致为空串

cin.ignore()是专门用来消除结束输入缓冲区的回车的函数

我要回帖

更多关于 以回车结束的字符串 的文章

 

随机推荐