【问题标题】:Problems debugging simple console program :: CLion调试简单控制台程序时出现问题 :: CLion
【发布时间】:2014-11-27 00:04:06
【问题描述】:

在成为 Java 开发人员后,我正在尝试学习基本的 C++。所以我决定试试 CLion。我编写这个基本代码只是为了让自己熟悉一些 C++ 语法。

#include <iostream>
using namespace std;

int main() {
    string word;

    cout << "Enter a word to reverse characters: " << endl;
    getline(cin, word);

    for(int i = word.length(); i != -1; i--) {
        cout << word[i];
    }

    return 0;
}

代码可以正常工作。它反转您输入的任何单词。我想逐步查看变量和其他变量,并测试 CLion 的调试器。

当我到达时出现我的问题

getline(cin, word);

当我踏上这一行时,我输入一个单词并按 Enter。然后跨过去。在我这样做之后,什么也没有发生;所有的 step over、in 等按钮都被禁用。我无法继续循环,或运行其余代码。

我已经多次使用 Eclipse 的调试器进行 Java 开发,没有任何问题。任何想法都会有所帮助。

TL;DR 如何使用 CLion 单步执行具有基本输入和输出的 C++ 命令行程序?

【问题讨论】:

  • 没有回答你的问题,但你有未定义的行为:string word; char wordReversedArray[word.length()]; - 你有一个长度为 0 的数组,你试图写入...
  • @John3136 你是对的。我将代码更改为更清晰一点。同样的问题仍然存在。
  • 可以像缓冲一样简单 - cout &lt;&lt; "str"; 写入控制台/终端。控制台可以缓冲一些东西,直到它得到一个换行符。试试cout &lt;&lt; "str" &lt;&lt; endl; 看看这是否能解释事情......
  • @John3136 这解决了一个问题。它现在按预期打印。但是我在输入时仍然遇到问题。
  • 在循环之前添加cout 以显示单词。在循环中添加cout 以显示i。看看一切是否如你所愿。 C++ 使用基于 0 的索引,因此 word[word.length] 无效。

标签: c++ console console-application clion


【解决方案1】:

我已经复制了这个问题 - 在我看来,当调试换行符被 IDE 吞下并且没有传递回程序时,它看起来像。 I've submitted a bug to JetBrains。除了退出 IDE 并直接使用 GDB 或其他 IDE 进行调试之外,我没有找到解决此问题的方法。


更新:此问题已在 Clion EAP Build 140.1221.2 中修复。它甚至做出了发布说明中列出的第一个更改:

最有价值的变化是:

  • 调试器不再挂在“cin >>”运算符上。

【讨论】:

  • 唉,这似乎没有在最新的 EAP 中得到修复。
【解决方案2】:

查看您的代码,如果一切正确,则需要添加#include &lt;string&gt;

当我运行它时,它会编译并完成输出。

#include <iostream>
#include <string>

int main() {

    std::string word;

    std::cout << "Enter a word to reverse chars: ";
    std::getline(std::cin, word); //Hello

    for (int i = word.length() - 1; i != -1; i--) {
        //Without - 1 " olleh"
        //With    - 1 "olleh"
        std::cout << word[i];
    }
    std::cout << std::endl;
    system("pause");
    return 0;
}

【讨论】:

  • std::string 上的某些C++ 实现可能与iostream 一起可用,而无需明确包括string。此外,如果std::string 不可用,您会看到编译时错误并且在调试时不会出现问题。
  • @MohitJain 是的,但使用iostream,您调用std::cin.getline(char*, streamsize)。使用string,您可以拨打std::getline(std::istream, std::string)
【解决方案3】:

使用以下代码。我已经修改了您的代码,使其适用于您的目的。 :)

#include <iostream>
#include <string>
using namespace std;

int main() {
    string word;

    cout << "Enter a word to reverse characters: " << endl;
    getline(cin, word);

    for(int i = word.length() - 1; i != -1; i--) {
        cout << word[i];
    }

    printf("\n");

    system("pause");

    return 0;
}

【讨论】:

  • 为什么说可以使用 system("pause")?您不认为初学者会从研究如何在 C++ 中实际反转字符串中受益吗? string(s.rbegin(), s.rend()) 暗示 s 是一个字符串?
  • 其实不明白你在说什么。 System("pause") 实际上可以让我们在程序执行完成后看到输出窗口。它与字符串反转无关。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-17
  • 2013-05-18
  • 1970-01-01
相关资源
最近更新 更多