2017-08-26 10 views
-4

このコードは、このSIGSEGVエラーを示していますが、これはセグメンテーションエラーです。助けてもらえますか? コードは、大文字小文字を区別しない大文字と小文字の区別がない入力文字列の数を入力文字列に複数回返します。 私はこれをプログラミング上の課題に使用しています。これは単なる関数です。プロセスはSIGSEGVシグナルで早期に終了します

したがって、「aabcdef」を入力すると、「a」が2回発生するため、2を返します。入力にはアルファベットと数値を含めることができます。

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

何を使用することができます。 'アウトタウンド? – snr

+0

@snr 'Z'は 'z'に変換されるので、[26] ++;アウトタウンド境界ではない – yaoshinga

答えて

0

問題は、あなたが私たちが知っているように、UBを持って、境界の外に書くことができ、ここで

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

です。


修正

まずあなたは文字が​​

あなたは tolower(c)

を介して下部に文字を変換する必要が続いて

そして、第一の低ケースの手紙をサブとの手紙があるかどうかを確認する必要がありますアルファベットでc - 'a'

次に、配列を索引付けしてその値を増やすことができます。

Here is fixed code


我々はであるので、あなたは `[ 'Z'] ++について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. 
関連する問題