因此,当我用 字符串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并将它们单独发送到写入功能。我使用的示例很简单,但我将使用更长的字符串。
答案 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");
),并最终导致堆栈溢出。