お初ですが質問させてください。
今作っているコードで
標準入力から文字列を読み込み、その中のアルファベットの出現回数(文字「a」が何回、文字「b」が何回、…)を計算し、出現回数が1以上の文字について次のように表示(文字・出現回数・グラフ)するプログラムを書け。
結果
input string: Tokyo Osaka Nagoya
N --1 *
O --1 *
T --1 *
a --4 ****
g --1 *
k --2 **
o --3 ***
s --1 *
y --2 **
というコードを作って
#include<stdio.h>
int main(void)
{
int kmozi[301];
int cnt = 0, mcnt, aknt;
char buff[256];
printf("文字列入力:");
gets(buff);
while(kmozi[cnt] <= 299)
{
kmozi[cnt] = 0;
cnt++;
}
//scanf("%s", buff);
for(cnt = 0;kmozi[cnt] <= 126;++cnt)
{
//kmozi[cnt] = 0;
for(mcnt = 0;buff[mcnt] != '\0';++mcnt)
{
if (buff[mcnt] == cnt)
{
kmozi[cnt] += 1;
}
}
if (kmozi[cnt] > 0)
{
printf("%c -- %d\t", cnt, kmozi[cnt]);
aknt = 0;
while(kmozi[cnt] > aknt)
{
printf("* ");
++aknt;
}
printf("\n");
}
}
return(0);
}
という感じで作ったのですが
これを実行すると
Run-Time Check Failure #2 - Stack around the variable 'kmozi' was corrupted.
(Press Retry to debug the application)
というデバックエラーが起こるのですがどうすればこのエラーが出なくなるのか教えてもらえませんでしょうか?
よろしくお願いします。
教えてください(文字と文字列について)
Re:教えてください(文字と文字列について)
出現回数をカウントする部分と、表示する部分は、分けて考えましょう。
カウントはこんなんかな。
カウントはこんなんかな。
for(mcnt=0 ; buf[mcnt]!='\0' ; ++mcnt) kmozi[buf[mcnt]]++;
Re:教えてください(文字と文字列について)
おまけでC++バージョン。
全角と半角を混ぜた場合に、グラフがずれるのは仕様
全角と半角を混ぜた場合に、グラフがずれるのは仕様
#include <iostream> #include <map> #include <string> int main() { setlocale(LC_CTYPE, ""); std::map<wchar_t, int> check; // 文字列取得 std::wstring str; std::cout << "文字列入力:"; std::wcin >> str; // 文字数を数える { std::wstring::const_iterator it = str.begin(); for (; it != str.end(); ++it) { ++check[*it]; } } // 結果を出力 { std::map<wchar_t, int>::const_iterator it = check.begin(); for (; it != check.end(); ++it) { std::wcout << it->first << L"--" << it->second; for (int i = 0; i < it->second; ++i) { std::cout << "*"; } std::cout << std::endl; } } return 0; }
Re:教えてください(文字と文字列について)
返信遅くなって申し訳ないです。
GPGAさんnonさん、返信ありがとうございます。
言われた通りに
for(mcnt=0 ; buf[mcnt]!='\0' ; ++mcnt)
kmozi[buf[mcnt]]++;
を入れてみたらエラーが出なくなりました。
どうもありがとうございました。
また何かわからないことがありましたら聞くことがあるかと思いますが、
その時はまたよろしくお願いします。
GPGAさんnonさん、返信ありがとうございます。
言われた通りに
for(mcnt=0 ; buf[mcnt]!='\0' ; ++mcnt)
kmozi[buf[mcnt]]++;
を入れてみたらエラーが出なくなりました。
どうもありがとうございました。
また何かわからないことがありましたら聞くことがあるかと思いますが、
その時はまたよろしくお願いします。