在一个简单的程序中std :: ispunct中的断言失败

时间:2018-01-19 09:16:35

标签: c++ c++11

我使用的是Stanley B.Lippman的C ++入门书,这个错误是由Excersise 3.2.3测试3.10的解决方案引起的。它要求编写一个程序来读取一串字符,包括标点符号并写下读取的内容但删除了标点符号。

这里是代码:

ngStyle="{'max-width': '20px' }"

当我在Visual Studio 2017中运行此代码时,它显示了这个:

#include "stdafx.h"
#include <iostream>
#include <string>
#include <cctype>

using namespace std;

int main() {
  string s;
  cout << "Please input a string of characters including punctuation:" << endl;
  getline(cin, s);
  for (auto c : s) {
     if (!ispunct(c))
         cout << c;
  }
  cout << endl;

 return 0;
}

为什么它会这样显示?我无法理解。

1 个答案:

答案 0 :(得分:2)

虽然你得到的断言失败是由于对std::ispunct()的错误调用(你应该使用unsigned char迭代字符串),但正确的解决方案是使用std::iswpunct

#include <iostream>
#include <string>
#include <locale>
#include <cwctype> // std::iswpunct

int main()
{
    std::wstring s;
    do {
        std::wcout << "Please input a string of characters including punctuation:\n";
    } while (!std::getline(std::wcin, s));

    for (auto c : s) {
        if (!std::iswpunct(c))
            std::wcout << c;
    }
    std::wcout << std::endl;
}

在Windows平台上,std::wstring 1 std::iswpunct的结合将使您能够正确处理中文字符。请注意,我假设您的系统区域设置为"zh_CH.UTF-8"。如果不是,您需要imbue您的信息流。

1)看到关于the difference between string and wstring的优秀答案。