我对问题的输入必须像这样: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的情况下读取输入。
答案 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;
}