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

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

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

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

Q&A

解決済

3回答

1649閲覧

C言語 文字列の操作に関する問題

aya0

総合スコア16

C

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

0グッド

0クリップ

投稿2020/02/24 08:05

編集2020/02/27 02:12

問題
文字列sの中に、文字cが含まれていれば、その添え字(文字列中に文字cが複数ある場合は、最も先頭側の添え字とする)を返し、含まれていなければ-1を返す関数を作成せよ。
int str_char(const char s[],int c){/ ・・・/}**

下記は私が考えた、この問題に対するプログラムです。

#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> int str_char(const char s[], int c) { int i; int len = 0; while (s[len]) len++; for (i = 0; i < len; i++) { if (s[i] == c) return i; } return -1; } int main(void) { char str[128]; int co; printf("文字列を入力してください\n"); scanf("%s", str); printf("文字を入力してください\n"); scanf("%d",&co); printf("文字列の中にある入力した文字の添え字は%d\n", str_char(str, co)); return 0; }

このプログラムを実行すると、int str_char(const char s[],int c){/* ・・・*/}の返却値が必ず-1になってしまいます。
なぜ、if (s[i] == c) return i;としては、いけないのか理由が知りたいです。
よろしくお願いします。

下記は訂正後のコードです

#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> int str_char(const char s[], int c) { int i; int len = 0; while (s[len]) len++; for (i = 0; i < len; i++) { if (s[i] == c) return i; } return -1; } int main(void) { char str[128]; int a; char co; printf("文字列を入力してください\n"); scanf("%s", str); printf("文字を入力してください\n"); scanf(" %c", &co); a = str_char(str, co); printf("文字列の中にある入力した文字の添え字は%d\n", a); return 0; }

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

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

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

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

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

guest

回答3

0

int co; を char co; に、
scanf("%d", &co); を scanf(" %c", &co); にしてください。
" %c" の中のスペースは重要です。
これがなくて "%c" ではどうなるか試してみて
なぜそうなるのかを調べてみてください。

追記

3名の方が回答してくださったやり方をまとめて、やってみたのですが、文字を入力する部分で入力待ちがされなくて正常に実行されませんでした。

まとめてやってはいけません。別々にやったらどうなりますか?

そこで、getchar();をscanf(" %c", &co); の前に追加することも行った結果、正常に実行されました!

scanf(" %c", &co); の前に getchar(); は不要です。

正常に実行されなかった理由はscanf("%s", str);の処理後、stdin(標準入力)にEnterが残ったままであったので、Enterがscanf(" %c", &co);に入ってしまったためと考えました。

scanf("%c", &co); なら co に '\n' が入りますが、
scanf(" %c", &co); なら co に '\n' は入りません。
%c の前のスペースが '\n' を読み飛ばすので、co には [Enter] の後の文字が入ります。

<<これがなくて "%c" ではどうなるか試してみて

なぜそうなるのかを調べてみてください。>>については
%dですと'a'',b'',c'などの文字を入力すると、その文字のコード(数値)がcoに入力されてしまい、(s[i] == c)が文字と数値の比較になってしまうため、-1が返却値になってしまうと考えました。

int co; scanf("%d", &co); で a や b の文字を入力すると、
それらは数字ではないので、co に数値は入りません。
int co; scanf("%d", &co); で 97 や 98 を入力すると、
co にはそれらの数値が入り、それらは 'a' や 'b' のコードの値なので
文字を探すことができます。

投稿2020/02/24 09:16

編集2020/02/26 15:44
kazuma-s

総合スコア8224

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

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

aya0

2020/02/25 07:19

回答ありがとうございます! 3名の方が回答してくださったやり方をまとめて、やってみたのですが、文字を入力する部分で入力待ちがされなくて正常に実行されませんでした。 そこで、getchar();をscanf(" %c", &co); の前に追加することも行った結果、正常に実行されました! 正常に実行されなかった理由はscanf("%s", str);の処理後、stdin(標準入力)に[Enter](char型である?)が残ったままであったので、[Enter](char型である?)がscanf(" %c", &co);に入ってしまったためと考えました。 ※[Enter]はchar型なのかは分かりません。 <<これがなくて "%c" ではどうなるか試してみて なぜそうなるのかを調べてみてください。>>については %dですと'a'',b'',c'などの文字を入力すると、その文字のコード(数値)がcoに入力されてしまい、(s[i] == c)が文字と数値の比較になってしまうため、-1が返却値になってしまうと考えました。
aya0

2020/02/27 02:14

ご指摘ありがとうございます! 私がkazuma-sさんの回答文を読み間違えてしまい本当に申し訳ありません。 %cの前にスペースを入れるとそのスペースが\nを読み飛ばしてくれるのですね! それと、scanf(" %c", &co);の部分なのですが、%cを%dにしても文字のコード(数値)を入力すれば、大丈夫だったのですね! 危うく、勘違いのまま終わるところでした。 すごく助かります!
guest

0

ベストアンサー

なぜ、if (s[i] == c) return i;としては、いけないのか理由が知りたいです。

いえ、特に問題ありません。

問題があるのは値の入力の方で、scanf("%d",&co);intを入力させるようになっているので、「指定された文字コード」の文字を探す、という動作になってしまいます。

投稿2020/02/24 08:10

maisumakun

総合スコア145183

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

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

aya0

2020/02/25 07:20

回答ありがとうございます!
guest

0

先に回答された方と同じですが、解決策としては、
関数宣言のint str_char(const char s[], int c)の後半のint c
mainの中のint co;の2か所のintをcharにすると、
「文字コード」ではなく「文字」として認識されるのでよいかと思います。

投稿2020/02/24 09:20

Matsui_hero

総合スコア346

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

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

aya0

2020/02/25 07:20

回答ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問