使用SIGSEGV信号过早退出流程

时间:2017-08-26 15:10:04

标签: c++ string char

此代码显示此SIGSEGV错误,据我所知,是一个分段错误。有人可以帮忙! 代码返回不同的不区分大小写的字母字符和在输入字符串中出现多次的数字的计数。 我在编程挑战中使用它,所以这只是一个函数。

所以,如果我输入" aabcdef"因为'发生两次。输入可以包含字母和数字。

int duplicateCount(const char* in)
{
int a[39]={0},b=0;
for(int i=0;i<strlen(in);i++)
{
    if(in == NULL)
        return 0;


    if((int)in[i] < 97)
    {
        a[(int)in[i]]++;
    }
    a[tolower(in[i])-'a'+1]++;
}

for(int i=0;i<39;i++)
{
    if(a[i]>1)

        b++;
}


return b;

}

1 个答案:

答案 0 :(得分:0)

问题在这里

if((int)in[i] < 97)
{
    a[(int)in[i]]++;
}
a[tolower(in[i])-'a'+1]++;

你可以在界限之外写作,正如我们所知,它有UB。

<强>修正

首先,你必须检查字符是否带有isalpha(c)

的字母

然后你必须通过tolower(c)

将角色转换为更低的角色

以字母c - 'a'

分组第一个小写字母

然后,您可以索引数组并增加其值。

<强> Here is fixed code

由于我们在,您可以使用std::map

#include <iostream>
#include <map>

int main()
{
    std::string text("aabbc");
    std::map<char, int> letterCounter;

    for(auto& it : text)
    {
        letterCounter[it]++;
    }

    for (auto& it : letterCounter)
    {
        if (it.second > 1)
        {
            std::cout << "Character " << it.first << " has appeared "
                      << it.second << " times." << std::endl;
        }
    }

    return 0;
}

输出

Character a has appeared 2 times.
Character b has appeared 2 times.