检测空白字符,\ t,\ n等

时间:2014-12-22 21:45:41

标签: c++

我正在通过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;
}

1 个答案:

答案 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); });