【问题标题】:c++ infinite loop: recursive functionc++无限循环:递归函数
【发布时间】:2025-11-26 04:55:01
【问题描述】:

因此,当我使用 string str ("A:1,B:1"); 作为主输入的输入运行此函数时,我进入了无限循环,然后是分段错误(核心转储)。

void function (string str)
{
    if (!str.empty() || str.at(0) != ',')
    {
        if (isalpha(str.at(0)))
        {   
            if (str.find(',') != string::npos)
            {
                write(str.substr (0,str.find(','))); //takes this to another function to write in a file
                function (str.substr (str.find(',')+1,str.length()-1));
            }
        else
        {
            write(str.substr (0,str.length()));
        }
    }
}

有没有人能在这里阐明一下? 我怎样才能得到代码来分隔 A:1 和 B:1 并将它们单独发送到 write 函数。我使用的示例很简单,但我将使用更长的字符串行。

【问题讨论】:

  • 欢迎来到*。在此处阅读有关如何提问的信息。 *.com/help/asking 特别注意“如何创建一个最小、完整和可验证的示例”
  • 您好,谢谢。你能更具体一点吗?我在我的问题中没有提到您希望看到的什么? @JiveDadson
  • “阅读本文”的哪一部分你不明白?
  • 你有不平衡的{ }。一旦修复(根据选项卡),代码似乎可以工作:Demo
  • @Jarod42 - 这是他最小的问题。当括号关闭时,它会在某些输入上崩溃,一旦修复,它仍然不会按照他的意图进行。

标签: c++ string recursion infinite-loop


【解决方案1】:

我发现你的递归函数没有使用正确的字符串长度。

function (str.substr (str.find(',')+1,str.length()-1));

substrstring 类函数以长度为第二个参数。在您的情况下,长度应该类似于str.length() - str.find(',') - 1。否则,您将访问原始字符串内存之外的内容。

【讨论】:

    【解决方案2】:
       if (isalpha(str.at(0)))
       {   
    

    } 没有关闭 {

    isalpha 而言,它是一个旧的C 函数,具有非常用户不友好的界面。它实际上迫使您将参数转换为 unsigned char 以避免未定义的行为。就这样吧:

    if (isalpha(static_cast<unsigned char>(str.at(0)))) {
    

    !str.empty() || str.at(0) != ','

    不可能是正确的。它读取为 “如果字符串不为空,或者如果它为空并且它的第一个字符不是逗号” - 这将导致为空字符串引发异常。您的意思可能是 &amp;&amp; 而不是 ||

    我进入一个无限循环,然后出现分段错误(核心转储)

    您的代码中没有循环。很可能发生的情况是,您的 write 函数调用 function 的方式会导致无限递归(例如,简单地通过 function("A:1,B:1");),并最终导致堆栈溢出。

    【讨论】: