检测空格字符 t、 等
detecting white space characters, , , etc
我正在学习 c++ 入门第 5 版。 第5章中的练习陈述如下:
练习 5.11.. 编写一个程序来计算读取的空格、制表符和换行符的数量。
我尝试像练习 5.11 对以下代码所做的那样。但是,代码失败。任何人都可以提供一些示例来说明我将如何更正代码,以便在读取输入时正确迭代计数器unsigned int cnt = 0;
?
#include "stdafx.h"
#include <iostream>
int main(){
unsigned int cnt = 0;
char c1;
while (std::cin >> c1)
if (c1 == 't' || c1 == 'n' || c1 == ' ')
++cnt;
std::cout << "The number of spaces,tabs, newlines are: " << cnt << std::endl;
system("pause");
return 0;
}
C++中对字符进行分类的方法是来自<cctype>
的函数或来自<locale>
的函数:这两者都有std::isspace()
函数。请注意,您只能将正int
值传递给 <cctype>
中的函数,即确定char c
是否是您将使用的空间:
if (std::isspace(static_cast<unsigned char>(c))) {
// c is a space
}
仅使用 std::isspace(c)
会导致未定义的行为,如果char
是有符号的并且c
是负值。在典型系统上,非 ASCII 字符(或 UTF-8 编码的多个字节)使用负值。
原始代码中的问题包括:
-
'/n'
不是有效的字符文字;您可能打算使用'n'
。 - 您省略了许多空格字符,例如
'r'
(回车符)和'v'
(垂直空格) - 默认情况下,格式化输入运算符跳过所有前导空格。为避免这种情况,您可以使用
std::cin >> std::noskipws;
.就个人而言,我会使用std::istreambuf_iterator<char>
来获取角色。我想,这是你的主要问题。
计算空间的实用方法可能是这样的:
unsigned long spaces = std::count_if(std::istreambuf_iterator<char>(std:cin),
std::istreambuf_iterator<char>(),
[](unsigned char c){ return std::isspace(c); });
相关文章:
- 为字符串中每 N 个字符插入空格的函数没有按照我认为的方式工作?
- 如何在 C++ 中从文件中读取字符数组(带有一些空格)
- 防止在字符数组中输入双倍空格在 C++
- C++完全复制要字符串的字符列表,而不会忽略多个空格
- 将空格作为单字符数据类型的输入?
- 防止控制台在通道字符(在 c++ 中)中输入空格(即空格、制表符和换行符)
- 反转字符串中单词的位置,而不更改 O(1) 空格限制中特殊字符的顺序
- iStream 运算符跳过空格字符
- 从字符数组中删除双空格
- 循环以从字符数组中删除过多的空格 (C++)
- 在字符名称 c++ 中留出空格
- 检查字符串中的小写字符或空格.布尔值不起作用
- CIN 双精度和不带空格的字符串会导致错误
- 在 C++ 中输入带有空格的字符数组
- 如何将字符串拆分为一组 3 个字符,它们之间有空格
- 在字符串中的字符前添加空格C++插入函数
- 使用 fstream 在空格分隔文件中查看下一项(不仅仅是一个字符)的方法
- QString 从行首或行尾修剪非空格字符
- 回文,不包括特殊字符和空格
- 将字符串分为连续的非空格字符的序列