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

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

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

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

Q&A

解決済

6回答

3567閲覧

int型への文字の入力について

macg3n

総合スコア60

C

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

0グッド

0クリップ

投稿2017/08/24 15:23

###前提・実現したいこと
「文字を入れるのではなく、文字コードを入れているだけ」と認識しています。
int型の変数にその文字コードというのを入力させて、、とやろうとしたのですが、うまくいきません。なぜダメなのでしょうか。

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

文字列に入力した文字が含まれているかどうかを調べる関数 を書いたのですが、含まれていても含まれてないとなってしまいます。

###該当のソースコード

C

1#include <stdio.h> 2/* 文字列の中の最も先頭に位置する文字cを探索 */ 3int str_char(const char s[] ,int c) 4{ 5 int i=0; 6 while(s[i]){ 7 if(s[i]==c){ 8 return i; 9 } 10 i++; 11 } 12 13 return -1; 14} 15 16 17 18int main() 19{ 20 char str[128]; 21 puts("文字列を入力"); 22 scanf("%s",str); 23 puts("探したい文字を入力"); 24 int key; 25 scanf("%d",&key); 26 int ans=str_char(str,key); 27 if(ans!=-1){ 28 printf("[%d]にあります\n",ans); 29 } 30 else{ 31 puts("ありませんでした"); 32 } 33 34 return 0; 35 36} 37

###試したこと
key をchar型の配列として、str_char関数に渡すときにchar[0]として渡すとうまくいきます。

###補足情報(言語/FW/ツール等のバージョンなど)
C言語

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

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

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

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

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

guest

回答6

0

ベストアンサー

%d は画面から数字を受け取って、それを数値として変換して key に設定する識別です。
ですので文字を画面から受け取る為には %c である必要があります。

c

1scanf("%c", &key);

おそらくこう変更されると思いますが、標準入出力の動作でつまづくかと思いますので、先に助言を足しておきます。scanf は改行文字を抜き取りません。ですのでこれを呼び出すと前の文字列入力 %s の時の改行コードが次の %c に読み取られてしまい、結果入力がスキップされる事になります。

これを避ける為には一旦 getchar() で改行コードを抜き取っておく必要があります。

やろうとされておられる事はおそらくこうだろうなと思う物を貼っておきます。

c

1#include <stdio.h> 2 3/* 文字列の中の最も先頭に位置する文字cを探索 */ 4int str_char(const char s[], char c) 5{ 6 int i=0; 7 while(s[i]){ 8 if(s[i]==c){ 9 return i; 10 } 11 i++; 12 } 13 14 return -1; 15} 16 17int main() 18{ 19 char str[128]; 20 char key[1]; 21 22 puts("文字列を入力"); 23 scanf("%s", str); 24 25 getchar(); /* 改行文字を抜き取っておく */ 26 27 puts("探したい文字を入力"); 28 scanf("%c", &key[0]); 29 30 int ans = str_char(str, key[0]); 31 if(ans != -1){ 32 printf("[%d]にあります\n", ans); 33 } 34 else{ 35 puts("ありませんでした"); 36 } 37 38 return 0; 39 40}

勘違いされたのは、おそらく変数が数字だから %d を使うべきと思われた部分かと思います。scanf や sscanf、fscanf といった関数は、%d が与えられると入力から数字のみを読み取り、それ以外がくると入力を中断し、それを数値に変換して引数で与えられたアドレスにコピーします。

ですので 文字 を入力して貰うには %d でなく %c でなければなりません。

であれば getchar() でいいじゃんと思うかもしれませんが、getchar() は行入力でないため、1文字入力してバックスペースで直すといった事が出来なくなります。

投稿2017/08/25 00:08

編集2017/08/25 00:17
mattn

総合スコア5030

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

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

macg3n

2017/08/25 13:29 編集

うまくできました!勉強になります。ありがとうございました! ここで質問させていただきます。 char key[1] ; → char key ; とやっても同じように動きますが、配列として扱った方が良いのでしょうか?
mattn

2017/08/25 14:27

コードを書いている時にテストで puts(key); (実際は char key[2]; key[1] = 0; と宣言して) でチェックしていたのでその残骸でした。すみません。char key と書いた方が混乱が無かったですね。
macg3n

2017/08/26 11:02

わかりました!非常に助かりました。
guest

0

puts("探したい文字を入力");

puts("探したい文字の文字コード値を10進数で入力");
に変えて、その通りすればいいです。

投稿2017/08/25 04:29

otn

総合スコア84499

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

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

macg3n

2017/08/25 13:15

ありがとうございました!
guest

0

key をchar型の配列として、str_char関数に渡すときにchar[0]として渡すとうまくいきます。

とおっしゃっているので、たぶんkeyに入力しているのは、文字コードではなく文字を入力しているのではないでしょうか(aとかbとか)
scanfで書式%dに対して文字を入力しても、受け付けられず0が入ります。
なので現状のコードのまま成功させるには、文字を入力するのではなく、文字コードを入力する必要があります。
aであれば文字コードは97
bであれば文字コードは98
アスキーコード表

コード自体は問題ないように思えます。
文字コード(アスキーコード)に対する理解度が足りていないのだと思います。

投稿2017/08/25 00:07

ttyp03

総合スコア16998

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

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

macg3n

2017/08/25 12:55

なるほどです。ありがとうございました!
guest

0

プログラムはあなたの指示通り動きますが、どのあたりがあなたの期待と異なるのでしょうか?

https://wandbox.org/permlink/6s6aheQ6dEPDxsWT

投稿2017/08/24 15:40

編集2017/08/25 01:49
yohhoy

総合スコア6191

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

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

0

どうしてもint引数でやりたい場合

C

1#include <stdio.h> 2/* 文字列の中の最も先頭に位置する文字cを探索 */ 3int str_char(const char s[] ,int c) 4{ 5 int i=0; 6 printf("search '%xh/%c' from [%s]\n", c, c, s); 7 while(s[i]){ 8 if(s[i]==c){ 9 return i; 10 } 11 i++; 12 } 13 14 return -1; 15} 16 17 18 19int main() 20{ 21 char str[128]; 22 int key = 0; // 0入れとかないと scanf が1バイトしか書き込まない場合ゴミを渡してしまう 23 int ans; 24 25 puts("文字列を入力"); 26 scanf("%s",str); 27 printf("\n[%s]\n\n", str); 28 puts("探したい文字を入力"); 29 fflush(stdin); 30// scanf("%d",&key); 31 scanf("%c",&key); 32 33 ans=str_char(str,key); 34 if(ans!=-1){ 35 printf("[%d]にあります\n",ans); 36 } 37 else{ 38 puts("ありませんでした"); 39 } 40 41 return 0; 42 43}

投稿2017/08/25 00:03

WoodenHamlet

総合スコア306

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

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

mattn

2017/08/25 00:09

念のため、fflush(stdin) は windows でしか動きません。
macg3n

2017/08/25 13:15

ありがとうございました!
guest

0

scanf("%d",&key);とした場合「%dは、10進数で入力する」なので文字(数字以外)の入力では0となり検索できないのではないでしょうか?
また、数字を入れた場合、値が&keyに入りますが(1の場合に(int)1)、最初の文字列の中での数字はasciiコードなので(例として1は49)keyの値とは異なってしまいます。

無理にif((s[i]-'0')==c)とすれば数値であれば比較はできると思いますが、ご意図とされる動きでは無いと思います。

投稿2017/08/24 23:20

編集2017/08/24 23:40
A.Ichi

総合スコア4070

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

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

macg3n

2017/08/25 12:57

知りませんでした。。ありがとうございます!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問