【问题标题】:Why is this char stopping my program?为什么这个字符会停止我的程序?
【发布时间】:2011-11-13 16:58:44
【问题描述】:

换行符在 c++ 中是否有某种特殊意义?是非ASCII字符吗?

我正在尝试为较大的文本中的每个唯一 n 字符子字符串构建马尔可夫链。每次我遇到一个新的唯一子字符串时,我都会将它输入到一个映射中,该映射的值是一个 256 元素向量(扩展 ASCII 表中每个字符一个元素)。

当我打印出文件的全部内容时没有问题(“lines”是使用 ifstream 和 getline 构建的文本行向量):

for(int i=0; i<lines.size(); i++) cout << lines[i] << endl;

整个文本文件显示在控制台中。当我尝试将换行符返回给需要一个字符的函数时,就会出现问题。 “moveSpaces”是一个整数常量,用于确定每次迭代时在字符串向量中向前移动多少字符。

char GetNextChar(int row, int col){
    for (int i=0; i<MOVESPACES; i++) {
        if (col+1<lines[row].size()) {
            col+=1;
        } else {        // If you're not at the end of the line keep going
            row+=1;     // Otherwise, move to the beginning of the next row
            col=0;
        }
    }
    return lines[row].at(col);
}    

我已经使用调试器进行了调试,当它到达第二行的第一列时,它对我来说是废话——没有错误或任何东西。它在此函数中失败,而不是在调用函数中。

我使用的文件是《圣诞颂歌》(古腾堡计划中出现的第一件事)。以下是前几行供参考:

STAVE I:  MARLEY'S GHOST

MARLEY was dead: to begin with. There is no doubt
whatever about that. The register of his burial was

函数在应该返回第二行的第一个字符时中断。如果我去掉换行符,或者我在程序中逐行构建“行”向量,则不会发生这种情况。知道有什么问题吗?

【问题讨论】:

  • 我的调试器从不废话……显然,你的调试器不太礼貌
  • 老实说,我无法回答这个问题。 “失败”是什么意思?
  • @MSalters - 对不起,“失败”意味着控制台表明程序已经完成运行,但仍有大量它应该做的事情。不会抛出任何错误。出于好奇,你会说什么?
  • @jefflovejapan:考虑到你在调试器中运行它,考虑到你正在使用.at(),我会说“函数抛出std::out_of_range”。
  • @MSalters - 感谢您的回答。

标签: c++ ascii non-ascii-characters


【解决方案1】:

您的GetNextChar 函数假设如果您位于某行的最后一个字符,则下一行将有一个字符。如果下一行没有字符会发生什么?这可能发生在两个地方:当您到达文件末尾时,或者当下一行是空字符串时。

第二行是空字符串。

【讨论】:

  • 好点:所有关于换行符的讨论让我觉得他实际上有换行符。但是一开始的endl 告诉我,尽管提到了这些换行符,但他实际上并没有存储它们,只是将它们重新插入到输出中。
猜你喜欢
  • 1970-01-01
  • 2020-08-31
  • 1970-01-01
  • 2013-10-17
  • 2014-01-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多