在输入长度未知的情况下,如何读取用逗号分隔的数字?

时间:2019-10-17 12:30:46

标签: c

我对问题的输入必须像这样:3,5,9,6,2,8。 我无法知道序列将要包含多少个元素,因此数组应该是动态的。

我尝试使用getchar读取每个数字,然后在向数组中添加元素时重新分配内存,但是getchar一次只能读取一位数字的ASCII值,因此,如果我输入11,12,它将读取1 1 1 2.它也只将第一个1存储到数组中。

int main(int argc, char *argv[]) {
    int initialSize = 100;
    int intCount = 0;                      
    int *sequence = safeMalloc(initialSize);
    char c = getchar();

    // reads first DNA sequence dynamically
    while (c != '\n') {
        if(c==',')
        {
            c=getchar();
        }
        printf("%d\n",c);
        if (intCount < initialSize) {
            sequence[intCount] = c-'0';
            intCount++;
            c = getchar();
        } else {
            initialSize = initialSize * 2;
            sequence = realloc((char*) sequence, sizeof(char*) * initialSize);
            sequence[intCount] = c-'0';
        }
    }
    for(int i=0;i<strlen(sequence);i++)
    {
        printf("%d\n", sequence[i]);
    }
} // EDIT: Adrian added this as it was clearly just a 'typo' to omit it.

我减去ASCII值0得到实际的数字,但是当我需要读取整个数字时,它一次只能读取一位数字(例如:11而不是1,1)。 只要我不知道输入有多大,是否可以在不使用getchar的情况下读取输入。

2 个答案:

答案 0 :(得分:0)

如果数据只是整数:

while(isdigit(c = getchar())) {
    sequence[intCount] = 10 * sequence[intCount] + c-'0';
} 

否则,使用getdelim读取一个值并用strtod解析它

请注意,这需要一些额外的逻辑才能正确处理EOF(通常有多个while/getchar循环是不明智的做法,因为这会使该逻辑变得比必要的更为复杂),但是由于您的原始代码正在调用{{ 1}}在多个地方,而且似乎根本没有检查EOF,因此无论如何您都需要重构!上面的循环给出了总体思路。

这里有一些代码演示了getdelim的使用。读取为双精度,并允许输入以逗号或换行符分隔。

getchar

答案 1 :(得分:0)

我遇到过类似的事情,所以我没有经历过代码中的错误。

因为我们不知道输入的长度,所以需要做两件事 1)读取输入 2)解析并将输入转换为整数(如果位数不止一位)    strtok()确实有帮助

我仅使用getchar()完成了此操作,以下是程序的外观,请检查是否有帮助 并且可以改进。

#include<stdlib.h>
#include<string.h>
int main()
{

char *input=NULL;
char *tmp=NULL, *brk;
char *sep=",";
char ch;
int i=0;
int total=0;
int SIZE = 80; /* mostly line ends with 80 chars */
int *numbers=NULL;

input=malloc(SIZE*sizeof(char));
if(input == NULL) {
   /* Failed to allocate memroy */
   return 1;
}
/* ----------- read input ----- */
do {
     ch=getchar();
     input[i]=ch;
     i++;
     if(ch == ','){
        total++;
     }
     if(i>=SIZE) {
        input=realloc(input, sizeof(char)*(SIZE+i));
        if (input == NULL) {
            break; /* failed to allocate memory */
        }
     }

} while (ch !='\n');

printf("Total input numbers %d\n", ++total);
numbers=malloc(total*sizeof(int));
if (numbers == NULL) {
    /* Fail */
    return 1;
}
i=0;
/* ------ parse and convert strings to integers ------- */
for(tmp=strtok_r(input, sep, &brk);
    tmp;
    tmp=strtok_r(NULL, sep, &brk)){
    numbers[i]=atol(tmp);
    i++;

}
printf("The numbers are\n");
for(i=0;i<total;i++){
    printf("%d\n", numbers[i]);
}
 return 0;
}