【大喜利】【投稿~10/21(月)】買ったばかりの自転車を分解してひと言

c言語初心者です。

キーボードから与えられた英文に含まれる、各アルファベットの数を数えるプログラムを2次元配列を使用して作成して下さい。なお、小文字と大文字は区別しません。
という、問題で、プログラムを書いたのですが、どこをどのように修正すればよいのかわかりません。教えてください。

#include<stdio.h>
#include<ctype.h>

int main()
{
char str[26][2] = { 0 }, c[100];
int i = 0, j;
scanf("%s", c);

while (c[i] == '\n'){
if (islower(c[i])){
str[c[i] - 'a'][0]++;
}
else if (isupper(c[i])){
str[c[i] - 'A'][1]++;
}
i++;
}
for (j = 0; j < 26; j++){
printf("%c : %d\n", 'a'+j, str[j][0] + str[j][1]);
}

return 0;
}

A 回答 (6件)

正:while (c[i] != '\0') {


誤:while (c[i] == '\n'){

・whileの括弧内には継続条件が入ります。
・cに格納される文字列の終端は\0です。
    • good
    • 1

「2次元配列を使用して」という (謎の) 条件を無視している時点でアウトなわけだが, それ以上に 「'z'-'a' が 25 であ

は) なんじゃないかな>#5.
    • good
    • 0

#include<stdio.h>


#include<ctype.h>

#define BUF_SIZE 1024
#define ALPHABET_NUM 26
#define BEGINNING_OF_ALPHABET 'a'

int main()
{
  char buf[BUF_SIZE] = { 0 }; /* バッファ */
  int count[ALPHABET_NUM] = { 0 }; /* カウント数 */

  /* 文字列入力 */
  scanf("%s", buf);

  for (int i = 0;i < strlen(buf); i++) { /* 文字列長分繰り返す */
    /* カウントアップ */
    count[tolower(buf[i]) - BEGINNING_OF_ALPHABET]++;
  }

  /* 結果表示 */
  for (int i = 0; i < ALPHABET_NUM; i++) {
    printf("%c : %d\n", i + BEGINNING_OF_ALPHABET, count[i]);
  }

  return 0;
}

ちなみに自分ならばこう書きます。
・定数値はdefineで
・コメントは適時いれる
・大文字で入力されても、小文字で入力されてもtolowerに
 通してしまえば小文字になるので
 count[tolower(buf[i]) - BEGINNING_OF_ALPHABET]++; とする

※実際に上記ソースを動作させる場合は、行頭の全角スペースを
 半角スペースに置換してください
    • good
    • 1

http://dixq.net/forum/viewtopic.php?f=3&t=17641& …
同じ学校の人は解決したみたいですよ。

二次元配列についてはやっぱり謎な仕様(課題)ですねぇ。
特徴的な課題にして、自力で解いていない人をあぶり出す手なんでしょうかね?
# ググり易いし。
    • good
    • 0

%s で取ると改行は決して入りません>#1. というか, そもそも scanf を使う必然性がまったくない.



あと, 例えば 'Z'-'A' が 40 になる環境だったらどうしよう.

しかし, なんで 2次元配列を使わなきゃならんのか....
    • good
    • 0

stdio -> studio


whileはループ継続条件を書く。質問の記述だと改行以外で抜ける。
あと、scanfで得る文字列は改行が入るのか? 安全を考えるとループ条件はc[i]!=0の方が良いかな。
# 厳密に言うとscanfを使う時点でリスクがあるけど
    • good
    • 1

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


おすすめ情報