←検索窓の楽しみ方
  ショッピングモール  掲示板ランキング


【掲示板ご利用上の注意】

 ※題名は具体的に!
 ※学校の課題の丸投げ禁止!
 ※ソースの添付は「HTML変換ツール」で字下げ!
 ※返信の引用は最小限に!
 ※環境(OSとコンパイラ)や症状は具体的に詳しく!
 ※返信付き投稿の削除は禁止!
 ※マルチポスト(多重投稿)は慎んで!

 詳しくはこちら


 本当はこんなに大きく書きたくはないのですが、なかなか守っていただけなくて…。
 守ってくださいね。お願いします。(by管理人)

C言語ソース⇒HTML形式ツール   掲示板1こちら


管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    記事検索    ログ    タグ一覧

No.3992

sscanf:チェックしながら、入力したい
投稿者---あきき(2005/06/10 21:08:09)


複数の整数(ここでは2つ)を入力して、表示するプログラムのはずです。おそらく、sscanfのところで引っかかってるのではと思っていますが、ここ最近、理解したと思っていたので恐らく。
誰かご教授の程を願います。

/*fgetsで入力してsscanfでチェックしながら入力する*/
int main( void )
{
int num1 , num2 ;
char buff[SIZE_MAX+1];
char ch1,ch2;
char sp;


printf("2つの整数を入力してください\n");
fgets( buff, sizeof(buff), stdin );

while(1){
if(!( sscanf( buff, " %n%d %n%d%c", &ch1,&num1,&sp,&num2, &ch2) == 4 ) &&
ch1 == 0 &&
sp == 1 &&
ch2 == '\n'){
printf("整数を入力してください= %s\n",buff);
continue;
}
break;
}

printf("第1整数 *** %d\n",num1);
printf("第2整数 *** %d\n",num2);

return 0;
}


この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:sscanf:チェックしながら、入力したい 3993 RAPT 2005/06/10 21:22:28


No.3993

Re:sscanf:チェックしながら、入力したい
投稿者---RAPT(2005/06/10 21:22:28)


> if(!( sscanf( buff, " %n%d %n%d%c", &ch1,&num1,&sp,&num2, &ch2) == 4 )  &&
>     ch1 == 0 &&
>     sp == 1 &&
>     ch2 == '\n'){
まずはこれを下記のように書き換えて値をチェックしましょう。

int result;
result = sscanf( buff, " %n%d %n%d%c", &ch1,&num1,&sp,&num2, &ch2);
printf("sscanf.result = %d\n", result);
if(!( result == 4 ) ){
    puts("result != 4");
    if( ch1 == 0 ){
        puts("ch1 == 0");
        if( sp == 1 ){
            puts("sp == 1");
            if( ch2 == '\n' ){
                puts("ch2 == \'\\n\'");
            }else{
                puts("ch2 != \'\\n\'");
            }
        }else{
            puts("sp != 1");
        }
    }else{
        puts("ch1 != 0");
    }
}else{
    puts("result == 4");
}

# 仕様から、上記で result == 4 になることはありえないと思いますが。




この投稿にコメントする

削除パスワード

No.3996

Re:sscanf:チェックしながら、入力したい
投稿者---あきき(2005/06/11 00:28:39)


>if(!( sscanf( buff, " %n%d %n%d%c", &ch1,&num1,&sp,&num2, &ch2) == 4 ) &&
> ch1 == 0 &&
> sp == 1 &&
> ch2 == '\n'){
まずはこれを下記のように書き換えて値をチェックしましょう。
</pre>

こころみてみましたが、強制終了してしまいます。もともとのソースに原因があるのでしょうか?


この投稿にコメントする

削除パスワード

No.3998

Re:sscanf:チェックしながら、入力したい
投稿者---まきじ(2005/06/11 01:27:43)


>if(!( sscanf( buff, " %n%d %n%d%c", &ch1,&num1,&sp,&num2, &ch2) == 4 ) && ch1 == 0 && sp == 1 && ch2 == '\n'){
> printf("整数を入力してください= %s\n",buff);
> continue;
>}

sscanf の戻り値は、buff から読み取られ正常に変数に代入できた
フィールドの個数を返します。
%n は、int 型を返します。

if 文で、正しく無い時に、continue するのであれば、
条件がおかしいと思いますが。


この投稿にコメントする

削除パスワード

No.3999

Re:sscanf:チェックしながら、入力したい
投稿者---あきき(2005/06/11 01:52:49)


>>if(!( sscanf( buff, " %n%d %n%d%c", &ch1,&num1,&sp,&num2, &ch2) == 4 ) && ch1 == 0 && sp == 1 && ch2 == '\n'){
>> printf("整数を入力してください= %s\n",buff);
>> continue;
>>}
>
>sscanf の戻り値は、buff から読み取られ正常に変数に代入できた
>フィールドの個数を返します。
>%n は、int 型を返します。
>
>if 文で、正しく無い時に、continue するのであれば、
>条件がおかしいと思いますが。

おっしゃっておられる事でわかりかねる点がありますので、ソースコードを添付します

/*文字列でスペースを開け二つの整数を入力し、表示する。ただし、fgets関数、sscanf関数を用いる
ただし、条件として
  1.空文入力時はエラーメッセージを出力
  2.2つの整数の間にスペース以外の入力があった時はエラーメッセージを出力
  3.1つまたは2つの整数未入力があったときはエラーメッセージを出力   
*/
#include <stdio.h>

#define SIZE_MAX 80

/*fgetsで入力してsscanfでチェックしながら入力する*/
int main( void )
{
int num1 , num2 ;
char buff[SIZE_MAX+1];
char ch1,ch2;
char sp;
int result;

printf("2つの整数を入力してください\n");
fgets( buff, sizeof(buff), stdin );

result = sscanf( buff, " %n%d %n%d%c", &ch1,&num1,&sp,&num2, &ch2);
printf("sscanf.result = %d\n", result);

if(!( result == 4 ) ){
puts("result != 4");
if( ch1 == 0 ){
puts("ch1 == 0");
if( ch2 == 0 ){
puts("ch2 == '\n'");
if( sp == 1 ){
puts("sp == 1");
if( ch2 == '\n' ){
puts("ch2 == \'\\n\'");
}else{
puts("ch2 != \'\\n\'");
}


}else{
puts("sp != 1");
}
}else{
puts("ch2 != '\n'");
}
}else{
puts("ch1 != 0");
}
}else{
puts("result == 4");


}

printf("第1整数 *** %d\n",num1);
printf("第2整数 *** %d\n",num2);

return 0;
}


この投稿にコメントする

削除パスワード

No.4004

Re:sscanf:チェックしながら、入力したい
投稿者---まきじ(2005/06/11 12:39:12)


>おっしゃっておられる事でわかりかねる点がありますので、ソースコードを添付します

RAPT さんが、提示してくれたソースは、sscanf の使い方が
おかしいことを示す為のものです。

sscanf 戻り値は、なぜ、4 にしたのですか?
あと、if文の条件は、正しいですか?
その辺を、よく確かめてください。


この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    記事検索    ログ    タグ一覧




掲示板提供:Real Integrity