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

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

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

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

Q&A

解決済

3回答

9663閲覧

C言語 文字列に特定の文字が含まれているかを調べるプログラム。

infra____

総合スコア90

C

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

0グッド

1クリップ

投稿2020/08/20 13:19

以下プログラムは、『解きながら学ぶC言語』のp206ページから抜粋したものです。
本プログラムは、文字列strの中に、文字cが含まれていれば配列の添字をを返し、含まれていなければ-1を返すプログラムです。
3点質問があります。質問の該当箇所には、コメントを記載しています。

1.仮引数の戻り値にintを指定していますが、なぜ呼び出し側は、ch[0]を実引数として記述しているのか?
ch[0]はchar型では?

2."ABCDEFGHIJKLMNOPQRSTUVWXYZ" は,添字0〜25
"abcdefghijklmnopqrstuvwxyz"は、添字2651
とのことだが、二重引用符で区切られているため、添字は27
52ではないのか?

#include <stdio.h> /*--- 文字列strから文字cを検索し、最も先頭側の要素の添字を返す ---*/ int str_char(const char str[], int c) //質問1 { int i; for (i = 0; str[i] != '\0'; i++) if (str[i] == c) return (i); return (-1); } int main(void) { int no; char ch[10]; printf("英文字を入力してください:"); scanf("%s", ch); no = str_char("ABCDEFGHIJKLMNOPQRSTUVWXYZ" "abcdefghijklmnopqrstuvwxyz", ch[0]);//質問2 if (no >= 0 && no <= 25) printf("それは英大文字の%d番目です。\n", no + 1); else if (no >= 26 && no <= 51) printf("それは英小文字の%d番目です。\n", no - 25); else printf("それは英文字ではありません。\n"); return (0); }

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

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

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

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

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

guest

回答3

0

>1.仮引数の戻り値にintを指定していますが、なぜ呼び出し側は、ch[0]を実引数として記述しているのか?
戻り値ではなく、2番めの引数のことですよね。

int str_char(const char str[], int c) //質問1

たしかに、int c ではなく、char c でいいような気がします。

>とのことだが、二重引用符で区切られているため、添字は27~52ではないのか?
C言語では、二重引用符でくくられたものが続く場合は、それらを連結した文字列として認識されます。

"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
"abcdefghijklmnopqrstuvwxyz"

"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"

投稿2020/08/20 13:43

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

0

質問1 printf("%d \n", ch[0]);
質問2 printf("i:%d c:%d \n", i, c);

気になることはデバッグしたり処理途中の変数の中身を出力すると一目瞭然なことがありますよ。
ch[0]の中身は整数値で、例えば英小文字の'a'は文字コード97です
英小文字aを入力した場合には引数97が渡されて、
str[i] == cで英小文字aの文字コード97 == 引数97 が成立して、
i=26が渡されて25を引いて1が出力される流れです。

結果から"ABC...""abc"の添字はA=0から始まり、a=26となっているので連続しているということが分かります。
配列が0originなので27番目=26です。
それを考慮してaが1番目になるように-25してるようです。

英文字を入力してください:a 97 i:26 c:97 それは英小文字の1番目です。

C

1#include <stdio.h> 2 3/*--- 文字列strから文字cを検索し、最も先頭側の要素の添字を返す ---*/ 4int str_char(const char str[], int c) //質問1 5{ 6 int i; 7 8 for (i = 0; str[i] != '\0'; i++) 9 if (str[i] == c) { 10 printf("i:%d c:%d \n", i, c); 11 return (i); 12 } 13 return (-1); 14} 15 16int main(void) { 17 int no; 18 char ch[10]; 19 20 printf("英文字を入力してください:"); 21 scanf("%s", ch); 22 23 printf("%d \n", ch[0]); 24 25 no = str_char("ABCDEFGHIJKLMNOPQRSTUVWXYZ" 26 "abcdefghijklmnopqrstuvwxyz", 27 ch[0]); //質問2 28 29 if (no >= 0 && no <= 25) 30 printf("それは英大文字の%d番目です。\n", no + 1); 31 else if (no >= 26 && no <= 51) 32 printf("それは英小文字の%d番目です。\n", no - 25); 33 else 34 printf("それは英文字ではありません。\n"); 35 getchar(); 36 return (0); 37}

参考までに同じ結果を返すサンプルです。
文字コードが分かっているので配列に文字列を用意してループで添字を判定しなくとも計算だけで同じ結果を出力出来ます。

C

1#include <stdio.h> 2 3int main(void) { 4 char ch[4]; 5 printf("英文字を入力してください:"); 6 scanf("%s", ch); 7 8 if (ch[0] >= 65 && ch[0] <= 90) 9 printf("それは英大文字の%d番目です。\n", ch[0] - 64); 10 else if (ch[0] >= 97 && ch[0] <= 122) 11 printf("それは英小文字の%d番目です。\n", ch[0] - 96); 12 else 13 printf("それは英文字ではありません。\n"); 14 15 getchar(); 16 return (0); 17}

投稿2020/08/20 13:53

編集2020/08/20 14:25
mjk

総合スコア303

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

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

0

ベストアンサー

char型は文字型といわれてはいますが、実は8bitの整数型なのです。
数値の型は基本的に表せるサイズの大きい方へは自動的に変換されます。
8bitの整数であるchar型を、int型の引数渡すと、自動的にint型へと拡張されるのです。

C言語では、""で囲った範囲内で改行することはできません。
その代わり、間に何も書かずに、"ABC" "abc"と書いた場合は、
自動的に"ABCabc"という文字列としてみなされるという機能があるので、
一続きのものとして扱われます。
なので、間に'\0'は入りません。


なぜ、char型で良いのに、intなの?という点について、
C言語の文字リテラル、'A'とかは、実はint型なのです。
printf("char=%d\n",sizeof(char));
printf("\'A\' =%d\n",sizeof('A'));
printf("int =%d\n",sizeof(int));
を実行してみるとわかります。
char型は1バイトなのに対して、'A'はintと同じく4バイトあります。
C言語の仕様的にそうなっているのです。

投稿2020/08/20 13:47

編集2020/08/21 01:18
amiya

総合スコア1218

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

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

infra____

2020/08/21 04:32

とてもわかりやすかったです。 ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問