2013-01-23 185 views
-4

在一对括号内读取未知数的整数时非常麻烦。C:如何从输入中读取括号内未知数的整数?

例如:

(1, 2, 3) 

,但我们不多少整数有。

而不是完全读取它们作为一个字符串,任何人都可以有任何其他的想法来解决这个问题吗?

非常感谢。

+0

'男子3 calloc'? –

+0

假设你正在阅读一个文件,“man 3 fgetc”和“man 3 fscanf”,如果你感觉冒险的话。如果你在谈论可变参数列表,完全不同的答案。 – WhozCraig

+0

@WhozCraig我真的认为他想要将逗号分隔值列表解析为单个整数......所以你的答案更具相关性 –

回答

1

这是非常不清楚你真的想从发布的问题。但是,如果你正在讨论函数的可变长度参数,那么: 调查C中的Variable arguments

如果你正在讨论阅读未知的号码。然后你必须创建你自己的函数来逐个字符地读取数据,解析数字,括号和逗号的输入:一个基本的解析器可以做到这一点(注意,它没有经过测试,可以包含错误) - 相应地理解和修改它。你可以阅读任何没有。这个程序的整数。

#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; 
} 
0

如果u需要只读(和现在处理)U可以

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

  2. 读取字符c。如果它的空间/制表/ CR/LF继续步骤2别的步骤3

  3. 如果C == ')' 的阅读列表的结束

  4. 所以如果你在这里c是一个数字,所以你可以取回字符(使用ungetc(C,stdin))并重读所有数字为整数。在这里你可以根据你的意愿使用intger。继续到2.

如果列表的语法正确性高于算法else添加其中读取EOF上的C测试并在步骤4上测试alpha。

我想你可以用C重写算法而不用跳转。

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

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); 
...