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

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

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

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

Q&A

解決済

3回答

707閲覧

swith文を使用し、入力された文字をカウントする

kuyan

総合スコア6

C

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

0グッド

0クリップ

投稿2022/05/18 07:32

実現したいこと

タブ、改行を判別しカウントする
qが入力された場合にプログラムを終了し、カウントを表示する
宜しくお願い致します。

発生している問題・エラーメッセージ

caseのすべての項目に付いてしまっています(1行目)
if(n=="q")に以下のエラーがあります(3行目)

case label does not reduce to an integer constant この行に複数マーカーがあります - comparison with string literal results in unspecified behavior [-Waddress] - comparison between pointer and integer

該当のソースコード

c

1#include <stdio.h> 2 3int main(void) { 4 char n; 5 int a, b; 6 while(1){ 7 scanf("%s", &n); 8 switch(n){ 9 case " ": 10 a++; 11 break; 12 case "\n": 13 b++; 14 break; 15 default: 16 break; 17 } 18 if(n=="q"){ 19 break; 20 } 21 } 22 printf("タブ: %3d回\n",a); 23 printf("改行: %3d回\n",b); 24 25 return 0; 26}

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

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

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

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

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

SaitoAtsushi

2022/05/18 08:07

質問は何であるか明瞭にしたほうがよいです。 エラーメッセージの意味を答えればよろしいのでしょうか。 コード自体の問題点を答えればよろしいのでしょうか。 どこが間違えているというよりは全体に色んな知識が不足しているように見えるので、完全にわかるように解説しようとすると大変です。 回答すべき内容を絞ったほうが答えやすいです。
guest

回答3

0

ベストアンサー

まず前提として、C言語ではシングルクォーテーションとダブルクォーテーションで囲んだ文字列は型が異なります。

  • シングルクォーテーション:文字数値
  • ダブルクォーテーション:文字列配列のポインタ

今回ご提示されたコードは、標準入力された文字列をループで1文字ずつ判定してカウントするコードと読み取れました。switchでchar型のnと比較したいため、caseにはシングルクォーテーションで記載する必要があります。(if文のエラーもそれに該当するかと思われます)

switch(n){ case ' ': a++; break;

また、環境次第ではありますが、下記の点で思いがけない動作をするかと思いますので、うまく動作しない場合はご確認ください。

1.変数を初期化していないため、カウント結果がおかしくならないでしょうか?

int a, b;

2.変換指定子の"%s"は文字列の読み取りであり、char型のnに格納できないのではないでしょうか?

scanf("%s", &n);

3.タブをカウントする箇所にてスペースで比較されていますが、問題ないでしょうか?

switch(n){ case " ": a++; break;

投稿2022/05/18 08:52

Freedom645

総合スコア34

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

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

kuyan

2022/05/19 02:32

わかりやすいご説明ありがとうございます。お陰様で実行することが出来ました。 また、もし動作しない場合での対応などもより詳しく書いていただいてありがとうございます。うまく動作したので使用しませんでしたが、とてもありがたかったです。
guest

0

「文字」('a'とか'\n'とか)と、「文字列」("a"とか"\n"とか)の区別が付いていないので、全然駄目です。
このプログラムは一旦中断して、文字と文字列の違いを学びましょう。

投稿2022/05/18 08:14

otn

総合スコア84677

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

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

0

case " ":

これ、文字列(のアドレス)ですよ
ここは文字を指定すべきじゃ

if(n=="q"){

これもおなじ

投稿2022/05/18 08:01

編集2022/05/18 08:01
y_waiwai

総合スコア87784

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問