質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.35%
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

2回答

1341閲覧

c++ 文字のカウント

cgen

総合スコア17

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2021/12/24 12:34

前提・実現したいこと

https://onlinejudge.u-aizu.ac.jp/problems/ITP1_8_C
の問題が上手くいきません。なぜでしょうか。

問題文
与えられた英文に含まれる、各アルファベットの数を数えるプログラムを作成して下さい。 なお、小文字と大文字は区別しません。

Input
複数の行にまたがる1つの英文が与えられます。

Output
与えられた英文に含まれる各アルファベットの数を以下に示す形式で出力して下さい:

a : aの個数
b : bの個数
c : cの個数
.
.
z : zの個数

Constraints

英文が含む文字の数 < 1200

Sample Input

This is a pen.

Sample Output

a : 1
b : 0
c : 0
d : 0
e : 1
f : 0
g : 0
h : 1
i : 2
j : 0
k : 0
l : 0
m : 0
n : 1
o : 0
p : 1
q : 0
r : 0
s : 2
t : 1
u : 0
v : 0
w : 0
x : 0
y : 0
z : 0

実行結果

This is a pen. a

該当のソースコード

#include <iostream> #include <string> int main() { char ch; int counter[26] = { 0 }; //for (int i = 0; i < 26; i++) { // counter[i] = 0; //} while (std::cin >> ch) { if (tolower(ch) - 'a' >= 0) { counter[tolower(ch) - 'a']++; } } for (int i = 0; i < 26; i++) { std::cout << (char)('a' + i) << " : " << counter[i] << std::endl; } return 0; }

試したこと

また、if文でif (tolower(ch) - 'a' >= 0)としないと
counter[tolower(ch) - 'a']++;
にエラーがでてしまうのですがなぜでしょうか。

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

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

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

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

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

y_waiwai

2021/12/24 12:50

エラーが出たなら、エラーメッセージを提示しましょう エラーメッセージは、いらぬ翻訳省略しないで、出たそのママをコピペで提示してください
guest

回答2

0

ベストアンサー

また、if文でif (tolower(ch) - 'a' >= 0)としないと
counter[tolower(ch) - 'a']++;
にエラーがでてしまうのですがなぜでしょうか。

tolower(ch) - 'a' がcounterの範囲: 0~25 の下限/上限から外れることがある から。

[追記] 別解(のひとつ)

C++

1#include <iostream> 2#include <string> 3#include <map> 4#include <cctype> 5 6int main() { 7 std::map<char,int> counter; 8 char ch; 9 10 while ( std::cin >> ch ) { 11 if ( isalpha(ch) ) ++counter[tolower(ch)]; 12 } 13 14 for ( ch = 'a'; ch <= 'z'; ++ch ) { 15 std::cout << ch << " : " << counter[ch] << std::endl; 16 } 17}

投稿2021/12/24 13:25

編集2021/12/24 13:43
episteme

総合スコア16612

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

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

0

解答ではないですが、ヒントをば。

英文に、{ という記号 (ASCIIコードでは、小文字のzの次) が入っていたらどうなるか考えてみましょう。

検索用キーワード:isalpha バッファオーバーラン

投稿2021/12/24 12:50

majiponi

総合スコア1722

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問