【发布时间】:2017-11-25 20:05:09
【问题描述】:
我正在使用此代码:
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));
}
}
每次我从文本文件中读取“不”这个词时,都会收到以下错误:
调试断言失败!
程序:目录\SortingWords(Length).exe
文件:minkernel\crts\ucrt\src\appcrt\convert\istype.cpp
线路:36
表达式:c >= -1 && c 欲了解更多信息,请访问... [等]
当我点击“中止”时,我的程序以代码 3 退出。不知道这是否有帮助?
看起来它可能与撇号有关?此代码适用于在我的文档中查找所有其他单词,直到这个。并且适用于不包含撇号但包含大量其他标点符号的文档...
我尝试更改文本文件的编码(仅使用记事本制作),但这没有帮助。通常发现很多关于撇号的投诉,但没有有效的答案。谁能帮我弄清楚发生了什么?
【问题讨论】:
-
我的猜测是这是一个聪明的报价,但我无法告诉。
-
如果您在十六进制编辑器中查看文件,撇号是否只占用一个字节?它是您期望的编码值吗?如果您在调试器中捕捉到崩溃,它真的是您期望的地方吗(即在您向我们展示的代码段中)?所涉及的变量的值是多少?他们是你所期望的吗?
-
我尝试简单地逐字重写我的文件,而不是从原始来源复制和粘贴(就像我之前所做的那样)。很痛苦,但它已经成功了,现在正在处理各种标点符号和奇怪的情况。很抱歉浪费了您的时间!看起来使用的字符有问题。否则,只是为了满足任何好奇心,是的,错误正是在这里发生的(使用断点找到)并且变量看起来都很好!
-
顺便说一句,您应该不需要使用自己的断点来查找崩溃位置。 VS 应该在触发断言时在调试时自动中断,让您进入您关心的堆栈帧,以查看究竟是哪个调用导致了它以及程序的状态。
标签: c++ visual-studio c++11