我正在通过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;
}
答案 0 :(得分:7)
在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); });