我使用的是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;
}
为什么它会这样显示?我无法理解。
答案 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的优秀答案。