2017-05-22 5 views
0

私はこの質問が何度も尋ねられていることを知っていますが、私は間違っていることを把握することはできません。私は、文字列を入力して文字列に文字が現れる回数をカウントするようにユーザーに依頼します。これは私のコードです:Cの文字列の発生数をカウントする

実行するたびに、文字 'f'までの出現回数を出力します。その後、結果は正しくなく、一部の文字では乱数が出力されます。誰かが私にこの問題を解決する方法を教えてもらえますか、私が間違っていることを私に説明できますか?ありがとう。

enter a string 
abc 
a: 1 
b: 1 
c: 1 
d: 0 
e: 0 
f: 32767 
g: 1 
h: 0 
i: 1434561216 
j: 32767 
k: 206176841 
l: 1 
m: 1434561248 
n: 32767 
o: 1434561248 
p: 32767 
q: 1434561272 
r: 32767 
s: 171855872 
t: 1 
u: 0 
v: 1 
w: 206173472 
x: 1 
y: 206173376 
z: 1 
+1

のようになります(I = 0をint型;私は<5; I ++)は'なぜあなたはわずか4までにinitのですか?あなたの 'f'問題に対応しているようです。 – kaylum

+0

@kaylum私はそれを忘れてしまった。私は最初に5文字でプログラムをテストしていました。ありがとう。 – rissandimo

+0

@rissandimoだからあなたの問題かどうか? – kaylum

答えて

1

最初の5文字カウントのみを初期化します。

// assign alphabet number arrays to 0 
for(int i=0; i < 5; i++) 
{ 
    alphabetLowerNumbers[i] = 0; 
    alphabetUpperNumbers[i] = 0; 
} 

は、プログラムの主な欠点は、例えば97又は5用としてマジックナンバーを使用している

// assign alphabet number arrays to 0 
for(int i=0; i < 26; i++) 
{ 
    alphabetLowerNumbers[i] = 0; 
    alphabetUpperNumbers[i] = 0; 
} 
+1

注: 'alphabetUpperNumbers'の宣言では、配列のサイズも大きくする必要があります。今は5つの要素しかないので、5を超える初期化は未定義の動作を呼び出します。 – ShadowRanger

+0

@ShadowRanger私はステップごとにロジックを書きたいと思っていました。これで、アルファベットの下位のアルファベットが正しく機能するようになったので、アルファベット順の文字を受け入れるプログラムを終了します。 – rissandimo

0

であるべきです。このループアレイalphabetLowerNumbersのみ5つの要素が初期化され

for(int i=0; i < 5; i++) 
{ 
    alphabetLowerNumbers[i] = 0; 
    alphabetUpperNumbers[i] = 0; 
} 

。配列の他のすべての要素には不確定な値があります。

(注:あなたの代わりにループを使用して、その宣言の配列を初期化することができたとえば

int alphabetLowerNumbers [26] = { 0 }; 

文字列userInputはその容量より少ない文字を含めることができます。また、終端ゼロの'\0'と改行文字'\n'を含めることができます。だからこのループ。

for(int i=0; i < 30; i++) 
{ 

    int ascii = userInput[i]; // ascii 

    alphabetLowerNumbers[ascii - 97]++; 

} 

は、プログラムの動作が不定になります。

は、少なくともループがために `

for (size_t i = 0; userInput[i] != '\0' && userInput[i] != '\n'; i++) 
{ 
    //... 
} 
関連する問題