c ++无限循环:递归函数

时间:2017-12-02 04:13:45

标签: c++ string recursion infinite-loop

因此,当我用 字符串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并将它们单独发送到写入功能。我使用的示例很简单,但我将使用更长的字符串。

2 个答案:

答案 0 :(得分:0)

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

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

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

答案 1 :(得分:0)

   if (isalpha(str.at(0)))
   {   

}没有结束{

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

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

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

不可能是对的。它读作&#34;如果字符串不是空的或者它是空的并且它的第一个字符不是逗号&#34; - 这将导致异常为空字符串抛出。您可能需要&&而不是||

  

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

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