teratail header banner
teratail header banner
質問するログイン新規登録
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

2回答

702閲覧

どこが間違っているかを教えてください

oshi4325

総合スコア0

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2022/08/16 14:06

0

0

入力された文字の出現回数をカウントしようという課題をやっていて、自分は下のようなコードを作ったのですが文字を入力するところまでしか動かず、下の二つの関数が動いてくれません。
daigaku と入力したら
d:1回
a:2回
i:1回
g:1回
k:1回
u:1回
と出力されるようにしたいです。
コードはこんな感じです。
どうか回答よろしくお願いします。
#include<stdio.h>
#define MAX 101

count_ch_in_str();
disp();

char g_ch[MAX], input[MAX];
int g_chcount[MAX];

int main(void) {

printf("スペースなしの文字列>"); scanf("%s",input); count_ch_in_str(); disp(); return 0;

}
count_ch_in_str() {
int counta,countb;
for (int i = 0; i != MAX; g_chcount[i])g_chcount[i] = 0;
for (counta = 0; input[counta] != '\0'; counta++) {
for (countb = 0; g_ch[countb] != '\0'; countb++) {
if (input[counta] == g_ch[countb]) {
g_chcount[counta]++;
}
else {
input[counta]=g_ch[counta] ;
g_chcount[counta]++;
}
}
}
}
disp() {
for (int count = 0; g_ch[count] != '\0'; count++) {
printf("%c: %d回\n", g_ch[count], g_chcount[count]);
}
}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jimbe

2022/08/16 14:55

コードはマークダウン記法をご利用ください。 マークダウン記法につきましてはヘルプを参照してください。
guest

回答2

0

とりあえず修正しておきました。

C

1#include<stdio.h> 2#define MAX 101 3 4void count_ch_in_str(); //修正 5void disp(); //修正 6 7char g_ch[MAX], input[MAX]; 8int g_chcount[MAX]; 9 10int main(void) 11{ 12 13 printf("スペースなしの文字列>"); 14 scanf("%s", input); 15 16 count_ch_in_str(); 17 disp(); 18 19 return 0; 20} 21 22void count_ch_in_str() //修正 23{ 24 int counta, countb; 25 int flg; 26 for (int i = 0; i < MAX; i++){ //修正 27 g_chcount[i] = 0; 28 g_ch[i] = '\0'; //追加 29 } 30 for (counta = 0; input[counta] != '\0'; counta++) { 31 //修正開始 32 flg = 0; 33 for (countb = 0; g_ch[countb] != '\0'; countb++) { 34 if (input[counta] == g_ch[countb]) { 35 g_chcount[countb]++; 36 flg = 1; 37 break; 38 } 39 } 40 if (flg == 0){ 41 g_ch[countb] = input[counta]; 42 g_chcount[countb]++; 43 } 44 //修正終了 45 } 46} 47 48void disp() //修正 49{ 50 for (int count = 0; g_ch[count] != '\0'; count++) { 51 printf("%c: %d回\n", g_ch[count], g_chcount[count]); 52 } 53} 54

投稿2022/08/17 07:36

tatsu99

総合スコア5540

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

c

1for (int i = 0; i != MAX; g_chcount[i]) g_chcount[i] = 0;

まずここで無限ループになっているような気がします。
どれだけループしても i はゼロのままであり、 MAX(101)と等しくなることはありません。

c

1 for (countb = 0; g_ch[countb] != '\0'; countb++) { 2 if (input[counta] == g_ch[countb]) { 3 g_chcount[counta]++; 4 } else { 5 input[counta] = g_ch[counta]; 6 g_chcount[counta]++; 7 } 8 }

ここもおかしいです。
ここは、input から取り出した1文字が、配列 g_ch の中に含まれているか調べ、含まれていない場合は、g_chに追加する部分だと思われます。
この場合、g_chに文字を追加するのは、最後まで一致する文字がなかった場合に限ります。
しかし、上のコードでは、チェックの途中であっても、文字が一致しなくなったらすぐに新しい文字をg_chに格納しようとしています。
さらに、新しい文字を格納する処理のところが逆になっています(inputの配列に、g_chの文字を格納している)。

投稿2022/08/16 14:45

編集2022/08/16 14:59
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.30%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問