ページ 11

教えてください(文字と文字列について)

Posted: 2008年11月14日(金) 15:41
by たっくん
お初ですが質問させてください。
今作っているコードで
標準入力から文字列を読み込み、その中のアルファベットの出現回数(文字「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:教えてください(文字と文字列について)

Posted: 2008年11月14日(金) 15:47
by GPGA
>while(kmozi[cnt] <= 299)
判定するのはcntが299以下のときではないですかね?

Re:教えてください(文字と文字列について)

Posted: 2008年11月14日(金) 16:14
by non
出現回数をカウントする部分と、表示する部分は、分けて考えましょう。

カウントはこんなんかな。
for(mcnt=0 ; buf[mcnt]!='\0' ; ++mcnt)
	kmozi[buf[mcnt]]++;

Re:教えてください(文字と文字列について)

Posted: 2008年11月14日(金) 16:43
by GPGA
おまけで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:教えてください(文字と文字列について)

Posted: 2008年11月17日(月) 09:55
by たっくん
返信遅くなって申し訳ないです。
GPGAさんnonさん、返信ありがとうございます。
言われた通りに
for(mcnt=0 ; buf[mcnt]!='\0' ; ++mcnt)
kmozi[buf[mcnt]]++;
を入れてみたらエラーが出なくなりました。
どうもありがとうございました。
また何かわからないことがありましたら聞くことがあるかと思いますが、
その時はまたよろしくお願いします。