C++ 为什么可以';我不能使用ifstream阅读撇号而不使其崩溃吗?

C++ 为什么可以';我不能使用ifstream阅读撇号而不使其崩溃吗?,c++,visual-studio,c++11,C++,Visual Studio,C++11,我正在使用以下代码: std::string word; std::ifstream f((file_name + ".txt").c_str()); while (f >> word) { good_input = true; for (int i = 0; i < word.length(); ++i) { if (ispunct(word.at(i))) { word.erase(i--, 1); }

我正在使用以下代码:

std::string word;
std::ifstream f((file_name + ".txt").c_str());
while (f >> word) {
    good_input = true;
    for (int i = 0; i < word.length(); ++i) {
        if (ispunct(word.at(i))) {
            word.erase(i--, 1);
        }
        else if (isupper(word.at(i))){
            word.at(i) = tolower(word.at(i));
        }
    }
std::字符串字;
std::ifstream f((文件名+“.txt”).c_str());
while(f>>word){
良好的输入=正确;
for(int i=0;i
每次我从文本文件中读取单词“不”时,都会出现以下错误:

调试断言失败!
程序:目录\SortingWords(长度).exe
文件:minkernel\crts\ucrt\src\appcrt\convert\istype.cpp
行:36
表达式:c>=-1&&c如所述:

如果ch的值不能表示为
无符号字符
且不等于
EOF

不能表示为
无符号字符,即其字符代码太大或太低

实际上,这在Windows上似乎不太可能,甚至可能不可能。更可能的情况是,您的文件中并没有真正包含撇号,而是包含一个看起来像撇号的字符,例如重音:
'

以下是如何以简单的方式重现问题:

#include <ctype.h>

int main()
{
    ispunct('\'');
    ispunct('´'); // undefined behaviour (crash or error message with Visual C++)
}
当然,现在
ispunt
将为字符返回零。如果确实需要覆盖
'
,则必须显式执行此操作,例如使用以下帮助函数:

bool extended_ispunct(int c)
{
    return static_cast<unsigned char>(c) || c == '´';
}
bool extended\u ispunt(int c)
{
返回静态_cast(c)| | c=='''''''';
}

我的猜测是,这是一个聪明的引用,但我没有办法告诉你。如果你在十六进制编辑器中查看文件,撇号是否只占用一个字节?它是你期望的编码值吗?如果你在调试器中发现崩溃,它真的是你期望的位置吗(即,在你向我们展示的代码中)?所涉及变量的值是什么?它们是您所期望的吗?我尝试了简单地逐字重新编写我的文件,而不是从原始源复制和粘贴(如我以前所做的那样)。很痛苦,但它成功了,并且现在适用于各种标点符号和奇怪的情况。很抱歉浪费了您的时间!使用的字符似乎有问题。否则,为了满足好奇,是的,错误正好发生在这里(使用断点发现)所有变量看起来都非常好!顺便说一下,您不需要使用自己的断点来查找崩溃位置。当触发断言时,VS应该在调试时自动中断,让您转到您关心的堆栈框架,以查看到底是哪个调用导致了它以及程序的状态。顺便说一下,
 cout@chris:Add
/W4
。它会告诉你原因:
警告C4310:cast截断常量值
。事实上,
'
在我的机器上是498440。@chris:是的,这是我函数中的一个错误!:)谢谢你发现它,让我来修复它。。。
bool extended_ispunct(int c)
{
    return static_cast<unsigned char>(c) || c == '´';
}