【问题标题】:Weird string behaviour奇怪的字符串行为
【发布时间】:2014-08-24 22:13:18
【问题描述】:

我正在尝试编写模拟控制台的代码。第一次运行正常,但从那里开始,字符串神奇地以空格开头,导致比较失败。在窗口中绘制时会出现空白,但如果写入系统控制台则不会出现。

strContent 存储正在显示的所有内容,而 strCurrLine 逐行保存用户输入。

strContent += "\n";
std::cout << strCurrLine << "!" << std::endl;

if (strCurrLine == "hello")
{
    strContent += "world";
}
else
{
    strContent += "Err: Command is not recognized";
}

strContent += "\n";

strCurrLine.clear();

void console::insertChar(char newChar)
{
    if (newChar == 8)   // if char is backspace
    {
        if (!strCurrLine.empty())   // before deleting, make sure string isnt empty
        {
            strContent.pop_back();  // delete last char
            strCurrLine.pop_back(); // ...
        }
    }
    else
    {
        strContent += newChar;          // add the char to displayed string
        strCurrLine += newChar;         // add the char to parsing string
    }
}

【问题讨论】:

  • 什么字符串以空格开头?这个字符串是从哪里来的?
  • @BenVoigt strCurrLine 保存用户输入
  • 你读到strCurrLine的情况如何?请显示更多代码。
  • @JonathanPotter 添加了更多代码
  • @chris:但那样他就无法炫耀他的 ASCII 流利程度了。

标签: c++ string string-comparison


【解决方案1】:

经过一些调试,我发现按回车键似乎在字符串前面添加了'\r'。使用以下代码将其删除。

if (strCurrLine[0] == '\r')
    strCurrLine.erase(0, 1);

【讨论】:

  • 您可能会在程序的其他部分添加\r,从std::cin 读取的换行符就是'\n'。也许您在某处使用过非标准输入函数?
  • \r 是回车符,但由于它与新行相关联,因此可能与您添加 '\n's 的某处有关。从您的代码中很难确定任何事情。
  • 还想指出,删除所有 '\r' 字符是一个坏主意,因为 (1) 它可能会在以后出现,并且 (2) 当你知道你的问题只是第一个字符。 char* str; if (*str == '\r') /* Reallocate without first byte. */
猜你喜欢
  • 1970-01-01
  • 2023-03-20
  • 1970-01-01
  • 2020-06-18
  • 2015-05-29
  • 2023-03-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多