-3

括弧のペア内に未知の数の整数を読み取るときは、かなり面倒です。

例えば:

(1, 2, 3)

しかし、整数がいくつあるかはわかりません。

それらを完全に文字列として読み取るのではなく、それを修正するための他のアイデアはありますか?

どうもありがとう。

4

4 に答える 4

1

投稿された質問からあなたが本当に何を望んでいるのかはひどく不明確です。しかし、関数の可変長引数について話している場合は、Cの可変長引数を調べてください。

あなたが不明な番号を読むことについて話しているなら。入力バッファからの整数の場合、数字、括弧、およびコンマの入力を解析して、文字ごとに読み取る独自の関数を作成する必要があります。これを行うための基本的なパーサーは次のとおりです(注、テストされておらず、バグが含まれている可能性があります) - それを理解し、それに応じて修正してください。何号でも読めます。このプログラムでの整数の。

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

typedef enum { START, OPAREN, CPAREN, COMMA, DIGIT, EOF_S,UNKNOWN }Token;
int c;
unsigned char state = 0;
int numbers[100];

Token getToken(FILE *f)
{
   while(isspace(c = fgetc(f)));
   if(c == EOF) return EOF_S;
   if(c == '(') return OPAREN;
   if(c == ',') return COMMA;
   if(c == ')') return CPAREN;
   if(isdigit(c)) return DIGIT;
   return UNKNOWN;
}

int getNumber(FILE *f)
{
   int returnNumber = 0;
   Token tok = START;
   while(tok != DIGIT){ 
     tok = getToken(f);
     if(tok == UNKNOWN){ state = 1; return 0x0FFFFFFF;}
     if(tok == EOF_S) { state = 2; return 0x0FFFFFFF;} 
   } 
   if(tok == DIGIT){
      while(tok == DIGIT){
         returnNumber = returnNumber * 10 + (c - '0');
         tok =getToken(f);
      }
   }
   return returnNumber;
}

int getNumbers(FILE *f, int *numbers_0)
{
   int number;
   int no_counter = 0;
   while(((number = getNumber(f)) != 0x0FFFFFFF) && (state == 0)){
      numbers_0[no_counter++] = number;
   }
   return no_counter; //returns no. of numbers between ( and ), separated by ','
}

int main(int argc, char *argv[])
{
   int no, i;
   no = getNumbers(stdin,numbers);
   if(no > 100) no = 100;
   for(i = 0; i < no; i++){
     printf("%d\n",numbers[i]);
   }
   return 0;
}
于 2013-01-23T07:40:11.767 に答える
0

これを行うための簡単なCコードの後

#include <stdio.h>

int main(int argc, char **argv)
{
    int x; char c='\0';

    scanf("%*[(]");

    while (c != ')' && scanf("%d %c", &x, &c)==2){

        if (c!=',' && c != ')') {
            printf ("format error in the input\n");
            break;
        }
        printf("Number: %d\n", x);
    }
}

入力ストリームが上記のコードに示されているようにstdin使用されている場合scanf

入力ストリームfilefscanf

于 2013-01-23T08:51:38.067 に答える
0

もしあなたが読むだけでいいなら(そして今すぐ処理する)あなたはできる

  1. C=='(' まで char C を読み取ります

  2. スペース/タブ/CR/LF の場合は char C を読み取り、ステップ 2 を続行します。それ以外の場合はステップ 3

  3. if C==')' 読み取りリストの終わり

  4. したがって、ここで c が数字の場合、char を取得し (ungetc(C,stdin) を使用)、すべての数値を整数として読み直すことができます。2に続く。

リストの構文が正しい場合は、上記のアルゴリズムを使用し、それ以外の場合は、EOF での読み取り C テストとアルファでのステップ 4 テストを追加します。

goto なしで C を使用してアルゴを書き直すことができると思います。

于 2013-01-23T07:51:49.967 に答える
0

以下のスニペットが役に立ちます。

int add(int *total, int count, ...)
{
   int i = 0;
   va_list numbers;
   va_start(numbers, count);
   for (i = 0; i < count; i++)
   {
       *total += va_arg(numbers, int);
   } 
   va_end(numbers);
}

この関数を次のように呼び出すことができます

...
int result = 0;
add(&result, 3, 10, 20, 30);
...
于 2013-01-23T09:06:29.573 に答える