gpt4 book ai didi

c++ - 简单程序中 std::ispunct 的断言失败

转载 作者:行者123 更新时间:2023-11-30 03:26:25 26 4
gpt4 key购买 nike

我正在使用 Stanley B.Lippman 的 C++primer 这本书,这个错误是由 Excersise 3.2.3 test 3.10 的解决方案引起的。它需要编写一个程序来读取包含标点符号的字符串并写入已阅读但标点符号已删除的内容。

代码如下:

#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;
}

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

Debug Assertion failed.
Expression:c>=-1&&c<=255
For information on how your program can cause an assertion failure,see the Visual C++ documentation on asserts.

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

最佳答案

尽管断言失败是由于对 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::wstring1std::iswpunct 的结合将使您能够正确处理汉字。请注意,我假设您的系统语言环境是 "zh_CH.UTF-8"。如果不是,您需要 imbue你的流。


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

关于c++ - 简单程序中 std::ispunct 的断言失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48337650/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com