检测空格字符 t、 等

detecting white space characters, , , etc

本文关键字:字符 空格 检测      更新时间:2023-10-16

我正在学习 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); });