C 无限环路:递归函数

c++ infinite loop: recursive function

本文关键字:递归函数 环路 无限      更新时间:2023-10-16

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

我看到您的递归函数不使用正确的字符串长度。

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

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

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

{没有关闭}

isalpha而言,这是一个旧的C函数,具有非常不友好的界面。它实际上迫使您将论点施加给unsigned char,以避免不确定的行为。所以做到:

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

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

不能正确。它的读数为"如果字符串不为空或它是空的,并且它的第一个字符不是逗号" - 这将导致为空字符串抛出一个例外。您可能是指&&而不是||

我进入无限循环,然后进入分段故障(核心倾倒)

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