2017-12-09 8 views
1

は、scanfにオプションの入力変数を持たせる方法がありますか?scanfにオプションの入力変数

私はEOFまで入力をスキャンするプログラムを持っています。 I型(またはファイルからの読み込み)する場合

+ 10 20 30 
- 10 20 30 
? 10 

+または - 私が入力したときには、常に3つの数字が続きますがされています。それの入力は次のように見ることができますか?必ず1つの番号(常に)が続きます。

私の現在のコードは次のようになります。

#include <stdio.h> 
#include <stdlib.h> 

int main(){ 
    char action; 
    int dc1,dc2,cable; 
    while(scanf(" %c %d %d %d",&action,&dc1,&dc2,&cable)!=EOF){ 
    if((dc1==dc2)||(cable<1)||(dc1>999)||(dc2>999)||(dc1<0)||(dc2<0)){ 
     printf("Wrong input.\n"); 
     return 0; 
    } 
    else{ 
     if(action=='+'){ 
     /*code*/ 
     } 
     else if(action=='-'){ 
     /*code*/ 
     } 
     else if(action=='?'){ 
     /*code*/ 
     } 
     else{ 
     printf("Wrong input.\n"); 
     return 0; 
     } 
    } 
    } 
    return 0; 
} 

今、それは私がを入力したい場合でも、3つの数字のすべての時間を入力するために私を必要とします「?」アクション。

scanfの変数のいくつかをオプションにする方法はありますか?入力 "?10"も有効です。

PS。

コードを削除して長すぎないようにしました。私は必要なものがすべて含まれていることを願っています。

コードをあまりにも多く修正する必要がなければ、基本的には完了しているので、私はまた感謝します。これは、私のコードを回すのを止めている唯一のものです。

PPS。これは宿題のためのものです。

+1

'scanf()'を使用しています。 'fgets()'を使って行を読み込み、 'sscanf()'を使ってそれを解析します。成功したコンバージョンの数を取得してテストし、適切に対応します。 –

+0

@JonathanLeffler私はfgets()とsscanf()にはあまり慣れていません。あなたはどうすればいいのですか? – Jano

+2

試しましたか?何を試しましたか?あなたが遭遇した困難は何でしたか?あなたは 'fgets()'を学ぶ必要があります。なぜなら、それを使う方法を知らないと役に立たないからです。十分な大きさのバッファ(文字配列)を使用するようにしてください。私はcharバッファ[4096];を提案して、不条理な入力でも問題が生じないことを合理的に確かめます。 'sscanf()'を使うのは簡単です。最初の引数として入力行を渡します。残りは 'scanf()'と似ています。 –

答えて

2

コメントに記載されているとおり、これはsscanf()fgetsで簡単に確認できます。 fgetsを使用して行を読み込み、それをパーサ関数に渡します。その関数は、行を解析しようとします。 sscanfは、正常に渡されたパラメータの数を返します。そのことに基づいて、countは入力を決定しています。

このコードは、起動方法の出発点にすぎません。これは、Jonathan Lefflerが上述したように、多くのエラーチェックを避け、技術に集中します。

コード例

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#define BUFFSIZE 256 

void add (int b,int c,int d){ 
    printf("%d+%d+%d=%d\n",b,c,d,b+c+d); 
} 
void sub (int b,int c,int d){ 
    printf("%d-%d-%d=%d\n",b,c,d,b-c-d); 
} 
void query (int a){ 
    printf("?%d\n",a); 
} 
void parseAndProcess(const char *buf){ 
    char a; 
    int b, c, d; 
    size_t ct; 
    ct = sscanf(buf,"%c%d%d%d",&a,&b,&c,&d); 
    if(ct <= 1){ 
     //error 
    } 
    else if(ct==2) { 
     if(a == '?'){ 
      query(b); 
     } 
     else{ 
      //error 
     } 
    } 
    else if(ct == 3){ 
     // error 
    } 
    else if(ct == 4){ 
     if(a == '+') add(b,c,d); 
     else if(a == '-') sub(b,c,d); 
     else{ 
      //error 
     } 
    } 
    else{ 
     // error 
    } 

} 

int main(void){ 
    char buf[BUFFSIZE]; 
    while(fgets(buf,BUFFSIZE,stdin)){ 
     parseAndProcess(buf); 
    } 
    return EXIT_SUCCESS; 
} 

ここaddsub方法は、実際のコードのために実施されるべきです。デモの実装を上に示します。たとえば、ここではaddには、subはオーバーフローチェックがありません。

関連する問題