此代码显示此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;
}
答案 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 强>
由于我们在c++,您可以使用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.