在一对括号内读取未知数量的整数时非常困扰。
例如:
(1, 2, 3)
但我们没有多少整数。
除了完全将它们作为字符串阅读之外,任何人都可以有任何其他想法来解决这个问题吗?
非常感谢。
答案 0 :(得分:1)
从发布的问题中你真正想要的是非常不清楚的。但是,如果您正在讨论函数的可变长度参数,那么: 查看C中的Variable arguments。
如果你正在谈论阅读未知的没有。输入缓冲区中的整数,然后你必须让你自己的函数逐个字符地读取,解析数字,括号和逗号的输入:下面是一个基本的解析器(注意,它没有经过测试,可能包含bug ) - 相应地理解和修改它。你可以阅读任何不。这个程序的整数。
#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;
}
答案 1 :(得分:0)
如果您只需要阅读(并立即处理),您可以
读取字符C直到C =='('
如果空格/制表符/ CR / LF继续步骤2,则读取字符C,否则执行步骤3
如果C ==')'阅读结束列表
所以如果你在这里c是一个数字所以你可以获取char(使用ungetc(C,stdin))并重新读取所有数字作为整数。你可以根据自己的意愿使用intger进行操作。继续2。
如果列表的语法正确,则在algo enogh上添加,在EOF上读取C测试,在alpha上测试第4步。
我想你可以使用C而不是goto重写算法。
答案 2 :(得分: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
答案 3 :(得分: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);
...