【问题标题】:Getting a forloop to complete its iterations (simple)获取一个 for 循环来完成它的迭代(简单)
【发布时间】:2013-09-23 08:32:23
【问题描述】:

我正在编写一段代码以将句号后的字母大写,但由于某种原因,每次我测试它时,当我在命令提示符中输入一些内容时,程序就会在我按下回车键后停止。任何帮助将不胜感激,谢谢。我知道循环在被破坏之前是无限的,这个想法是大写过程将继续直到满足循环被破坏的条件。

                if ((text.empty() != 1 ) && (text.at(text.size() - 1) != '!' ) && (text.at(text.size() - 1) != '?') && (text.at(text.size() - 1) != ':' ) && (text.at(text.size()-1 ) != ',' ) && (text.at(text.size() - 1 ) != ';' ) && (text.at(text.size() -1 ) != '=' ) && (text.at(text.size() -1 ) != '-' ) && (text.at(text.size() -1 ) != ')' ) && (text.at(text.size() -1 ) != '}' )  )
        {
            for (i = 0 ;  i >= 0 ; i++)
        {
            text.append("kk") ;
            if (text.find("." , j) < 0 )
                {
                    text.erase(text.size() - 1, 2) ;
                    text2.append(text) ;
                    writer << text2 << endl ;
                    text2.clear() ;
                    j = 0 ;
                    break ;
                }
                else
                {
                    j = text.find("." , j) + 1 ; 
                    k = j + 1;
                    letter = static_cast <int> ( text.at(k) ) ;
                    if (( letter < 123 ) && ( letter > 96 ))
                        {
                            letter = (letter - 32) ;
                            (text.at(k)) = static_cast <char> (letter) ;
                            text.erase(text.size() - 1, 2) ;
                        }
                    else 
                        {
                            text.erase(text.size() - 1, 2) ;
                            continue ; 
                        }
                }
        }
        }
        else 
        if (text == "")
        {
            text2.append("\n") ;
            writer << text2 << endl ;
            text2.clear() ;
        }
        else 
        {
            text2.append(text) ;
            writer << text2 << endl ;
            text2.clear() ;
        }
    }

【问题讨论】:

  • for (i = 0 ; i &gt;= 0 ; i++) 是你的问题。那是一个无限循环。它永远不会结束。你需要弄清楚你想要循环的究竟是什么。
  • 在满足测试条件时,无限循环仍然会中断,不是吗?
  • @user2779581 是的,你说得对,这不是你的问题,但你最好写while (true),它更具可读性,看起来不像是一个错误。
  • @jonhopkins 好吧,它可以结束,但我们正在进入 IB/UB 领域 - 滥用整数溢出通常是一件坏事
  • 道歉我还是新手,但你的意思是我应该写 while (true) do {etc) 来代替 for 语句,对吗?

标签: c++ string for-loop


【解决方案1】:

一些提示。

使用自动格式化。在我将其放入 vim 并 ='d 之前,您的格式已经无处不在。它有助于发现错误。

第二,

if ( (text == "end") || (text == "End") || (text == "ENd") || (text == "END") ) 

使用tolower 方法或toupper 方法进行不区分大小写的比较。

if (text == "19823717")

您似乎将其用作一个幻数来检测循环中的第一次。而是将此逻辑移到循环之外。

if ( (text == "end") || (text == "End") || (text == "ENd") || (text == "END") ) 
  {
    writer.close() ;
    cout << "End of session" << endl ; break ;
  }
  else 
    if (...

这里的其他地方让我害怕。它可能没有按照您的意图进行。将其包裹在{}s 中可能会更好

letter = static_cast <int> ( text.at(k) ) ;

你不需要这个演员表。 char 可以直接当作一个数字。以char a = 97; 为例。

if (( letter < 123 ) && ( letter > 96 ))

请改用toupper

除此之外。我不知道你的问题实际上是什么。这可能是一个微妙的逻辑错误,当您清理这些其他问题时会变得很明显。

【讨论】:

  • 感谢您的意见,但我是一个完整的初学者,当您说tolowertoupper 时,我并不真正理解您的意思,但我希望我能实现它们!我已经改变了你所说的关于幻数的内容,它实际上根本没有必要,我只是把第一个语句移了出来,它工作正常。我已经更新了我留下来修复的一点代码,如果你能再看看我会很感激。我什至喜欢经历整个过程,我只是看不出错误在哪里。太令人沮丧了!
【解决方案2】:

你的循环会持续一段时间,增加 j

那么,在这一行:

        j = text.find("." , j) + 1 ;

text.find 返回 -1,因此 j 变为零,因此您的循环重新开始。

【讨论】:

  • 循环迭代器是i,而不是j
  • 谢谢老兄,但现在我有另一个问题。当程序运行并且我按 Enter 键时出现错误并且一切都关闭并给出错误“在抛出 std::out_of_range what(): basic_string::at 的实例后调用终止。有什么想法吗?
  • @user2779581 您试图在小于0 或大于string 长度的字符串索引处获取char
  • 是的,我之前遇到过这个问题,但我仍然不确定修复是什么。我尝试在末尾附加两个额外字符的字符串以使句号不可能在末尾,我不知道如何再次摆脱它们​​,但它不起作用无论如何:/
最近更新 更多