【问题标题】:C++ in Xcode pausingXcode 中的 C++ 暂停
【发布时间】:2014-04-20 05:23:53
【问题描述】:

这是我的第一个 SO 帖子。 我对编程很陌生,使用 C++ 我想我可以尝试制作一个程序,允许用户提交一个文本块(最多 500 个字符),允许他们输入一个 4 个字母的单词,程序返回金额有时它会在文本中选择该词。 我正在使用 X 代码,它不断创建一个绿色断点并在“for”循环函数处暂停程序。我的代码如下所示:

#include <iostream>
#include <string>
#include <math.h>
#define SPACE ' '(char)
using namespace std;

//Submit text (maximum 500 characters) and store in variable
string text;
string textQuery(string msgText) {
do {
cout << msgText << endl;
    getline(cin, text); } while (text.size() > 500);
return text;
}
//Query word to search for and store as variable
string word;
string wordQuery(string msgWord) {

cout << msgWord << endl;
cin >> word;
return word;
}
//Using loop, run through the text to identify the word
int counter = 0;
bool debugCheck = false;
int searchWord() {

for (int i = 0; i < text.size(); i++) {
    char ch_1 = text.at(i);
    char ch_2 = text.at(i + 1);
    char ch_3 = text.at(i + 2);
    char ch_4 = text.at(i + 3);
    cout << i;

    if(ch_1 == word.at(0) &&
       ch_2 == word.at(1) &&
       ch_3 == word.at(2) &&
       ch_4 == word.at(3) )
    {

        counter++;
        debugCheck = true;

    }


}

return counter;
}
//cout the result
int main() {
string textUserSubmit = textQuery("Please submit text (max 500 characters): ");
string wordUserSubmit = wordQuery("Please select a word to search for: ");
int counterResponse = searchWord();
cout << debugCheck << endl;
cout << "The number of times is: " << counterResponse << endl;
return 0;
}

我在 for 循环中遇到错误。关于如何使我的程序适用于不同的单词、多种长度的单词以及如何突出显示文本中的单词的任何其他建议都会有所帮助。 如果有人可以帮助我解决我的问题,我将不胜感激。谢谢!

【问题讨论】:

  • 欢迎您!您可能希望将循环 while (text.size() &gt; 500) 更改为带有缓冲区变量的 if 语句,一旦用户达到 500 个字符,while 循环将无限循环。
  • @ultifinitus 不,他的程序的那一部分有效。该循环只是通过要求新输入直到达到他想要的大小(小于或等于 500 个字符长)来确保输入是“有效的”。
  • @bames53 嘿,你是对的!出于某种原因,我认为他在循环中附加文本,请忽略我心不在焉!
  • @bames53 我在 bames53 的帮助下修复了程序。我现在只需要弄清楚如何没有字数限制(即单词不必是 4 个字母长)并且它仍然可以工作。有什么建议么?顺便说一句,我做了建议的更改。
  • @user3553239 您不需要ch_1ch_2 等变量。您可以直接比较 text.at(i + 2) == word.at(2) 等。然后您应该能够弄清楚如何编写一个内部循环,其中您当前有 if 检查检查单词中的每个字符与 text 中的正确字符。

标签: c++ xcode breakpoints


【解决方案1】:

我在 for 循环中遇到错误。

您应该描述您遇到的错误。我碰巧可以访问 Xcode,因此我可以运行您的代码并查看会发生什么,但您应该尽量避免那些需要帮助的人。

在这种情况下,您应该描述调试器如何在该行停止程序:

char ch_4 = text.at(i + 3);

包括消息:“线程 1:信号 SIGABRT”和控制台输出显示

libc++abi.dylib: terminating with uncaught exception of type std::out_of_range: basic_string

您的问题是:for 循环检查以确保 i 在将其用作索引之前在字符串 text 的正确范围内,但随后您还使用 i+1、@987654329 @ 和 i+3 作为索引而不检查这些值是否也有效。

修复该检查,程序似乎运行良好(给定正确的输入)。


一些杂项。

  • 使用更一致的缩进。它使程序更易于阅读和遵循。 Here's 如何缩进(使用工具clang-format)。
  • #define SPACE ' '(char) 看起来是个坏主意,即使您不使用它也是如此。
  • using namespace std; 通常是不受欢迎的,但只要你不把它放在标题中,它通常不会造成太大的麻烦。不过我仍然可以,而且因为您可能无法理解由此产生的错误消息,您可能还是希望避免它。如果您真的不喜欢到处写std::,那么请使用更有限的应用程序,例如using std::string;using std::cout;
  • 应该避免使用全局变量,您可以在这里通过简单地将textUserSubmitwordUserSubmit 传递给searchWord() 来做到这一点。
  • 确实没有必要确保text 的长度小于或等于500 个字符。您使用的是std::string,因此它可以容纳更长的输入。
  • 您永远不会检查word 的长度,即使您的代码要求它至少有 4 个字符长。幸运的是,您使用 at() 对其进行索引,这样您就不会得到未定义的行为,但您仍然应该检查一下。我会删除textQuery 中的检查并在wordQuery 中添加一个。

【讨论】:

  • 感谢您回答我的问题!我还是很新,我不太明白修复是什么;你能提交修改后的代码吗?
  • @user3553239 您在 for 循环中的检查是 i &lt; text.size(),但您的代码最多使用 i + 3 作为索引。您应该确保&lt; text.size() 是什么值?
  • 我应该检查 i + 3。非常感谢!真的很有帮助。
猜你喜欢
  • 1970-01-01
  • 2015-04-26
  • 1970-01-01
  • 1970-01-01
  • 2011-05-19
  • 1970-01-01
  • 2019-10-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多