-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

我希望你正在寻找一个带有可变参数的函数实现,下面的代码片段会对你有所帮助。

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 回答
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

如果您的输入流是file然后使用fscanf

于 2013-01-23T08:51:38.067 回答
0

如果您只需要阅读(并立即处理),您可以

  1. 读取字符 C 直到 C=='('

  2. 如果它是空格/制表符/CR/LF,则读取 char C 继续步骤 2 否则步骤 3

  3. if C==')' 阅读列表结束

  4. 因此,如果您在这里 c 是一个数字,那么您可以取回 char(使用 ungetc(C,stdin) )并将所有数字重新读取为整数。在这里您可以根据需要使用 intger 进行操作。继续2。

如果列表在 algo enogh 之上的语法正确,则添加 where read C test on EOF 和 step 4 test on alpha。

我认为你可以在没有 goto 的情况下使用 C 重写算法。

于 2013-01-23T07:51:49.967 回答