scanf関数が実行されない

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
Sirius

scanf関数が実行されない

#1

投稿記事 by Sirius » 7年前

明解c言語という本の演習11-2,11-3についてですがこのようなコードを書きました。

コード:

#include <stdio.h>

int str_chnum(const char *str, int c)
{
	unsigned count = 0;

	while(*str){
		if(*str == c) count++;
		str++;
	}

	return count;
}

char *str_chr(const char *str, int c)
{
	char *p = NULL;

	while(*str){
		if(*str == c){
			p = (char *)str;
			break;
		}

		str++;
	}

	return p;
}

int main(void)
{
	char str[100];
	char ch;

	printf("文字列を入力してください:");
	scanf("%s", str);

	printf("検索する文字を入力してください:");
	scanf("%c", &ch);

	printf("入力された文字のアドレスは%p\n", str_chr(str, ch) );

	printf("入力された文字は%dこあります\n", str_chnum(str, ch) );

	return 0;
}
このプログラムはなんのエラーも出さずにコンパイルされましたが、
40行目のscanf文が実行されません。
1回めに出てくるscanf文は実行されるのになぜ2回めの方だけが実行されないのでしょうか?

nil
記事: 428
登録日時: 8年前

Re: scanf関数が実行されない

#2

投稿記事 by nil » 7年前

入力バッファに残っていた改行コード'\n'が37行目のscanfのあとに残り、それが読まれたのではないでしょうか

Sirius

Re: scanf関数が実行されない

#3

投稿記事 by Sirius » 7年前

すみません、意味がよくわからないので詳しく説明していただけますか?

nil
記事: 428
登録日時: 8年前

Re: scanf関数が実行されない

#4

投稿記事 by nil » 7年前

コード:

#include <stdio.h>

int main(){
	char str[256];
	char c;
	
	//	読み込み
	scanf( "%s", str );
	scanf( "%c", &c );

	//	表示
	printf( "%d\n", c );
	printf( "%d\n", '\n' );
}

コード:

--入力
str

--出力
10
10
まず初めにscanfを使ってstrへ文字列が入力されます。
この際、入力バッファの中には、
's','t','r' , '\n'
このように"str"とエンターを押した際に入力される(?)改行コード'\n'が入ります。
このうち、初めの3文字がstrに代入され、空白文字扱いの'\n'は入力バッファ内に取り残されてしまいます。

その次のscanfでは、この'\n'が読み取られ、cに代入されます。

文字コードというものも結局は数値ですから、printfの書式指定子%dを使えば、数値として表示できます。
基本的に'\n'==10として扱われるので、上記のように出力されます。

少々わかりづらい上に、文字コードなども絡んできますし、標準関数の挙動には疎いので
断言することはできませんが、多分以上のような感じだと思います。

Sirius

Re: scanf関数が実行されない

#5

投稿記事 by Sirius » 7年前

よくわかりました。ありがとうございます。
しかし、
1番最初のコードような実行結果を得たい場合どのようにすればいいんでしょうか?

フリオ

Re: scanf関数が実行されない

#6

投稿記事 by フリオ » 7年前

%sは先行する空白類文字を読み飛ばすので、chを文字列として読み込んでは?

ISLe
記事: 2646
登録日時: 9年前
連絡を取る:

Re: scanf関数が実行されない

#7

投稿記事 by ISLe » 7年前

40行目を
scanf("%c", &ch);
から
scanf(" %c", &ch);
(%cの前に空白を入れる)
に変更するのがもっとも簡単だと思います。

この空白によって改行コードが読み飛ばされます。
正確には前に入力した文字列以降に続く連続した空白類の文字がすべて読み飛ばされます。

検索する文字に空白文字を入力できなくなる点で元の動作と異なりますが、もともと検索対象の文字列に空白文字を含めることができないので仕様上は問題ないと思われます。

Sirius

Re: scanf関数が実行されない

#8

投稿記事 by Sirius » 7年前

%sは先行する空白類文字を読み飛ばすので、chを文字列として読み込んでは?
chを文字列として読み込むとはどういうことでしょうか?
また、どう実装すればよいのでしょうか?
scanf(" %c", &ch);
(%cの前に空白を入れる)
に変更するのがもっとも簡単だと思います。
空白を入れるタイミングなどはどのように見切ったらいいのでしょうか?

non
記事: 1097
登録日時: 9年前

Re: scanf関数が実行されない

#9

投稿記事 by non » 7年前

getchar(); を間に入れるという方法もあります。
non

閉鎖

“C言語何でも質問掲示板” へ戻る