所以我正在编写一个练习程序,它将整数作为stdin的输入,将它们加载到数组中,对数组进行排序,然后输出结果。
我一直在努力弄清楚C中的IO是如何工作的。以下是我到目前为止的情况,如果您发现任何问题/有任何建议,请告诉我。理想情况下我想避免使用缓冲区,但我似乎找不到另一种方法来允许可变大小的输入
输入格式:“10 20 30 11 666 1 235”......等等
// check if an input file is specified
// If one is specified, then sort those numbers, otherwise pull from stdin
if(inputFile == "stdin"){
// Load stdin into a buffer
char buffer[100];
if(fgets(buffer, sizeof(buffer), stdin) == NULL) {
Handle_EOForIOError();
}
// Get a count of the numbers to create the array
int numIntegers = 0;
int num;
while(sscanf(&buffer[0], "%d ", &num) == 1){
numIntegers++;
}
// Initialize the array with the proper size
numbers = (int*)malloc(numIntegers*sizeof(int));
// Load the integers into the array
int i = 0;
while(sscanf(&buffer[0], "%d ", &numbers[i]) == 1){
i++;
}
}
答案 0 :(得分:2)
问题是sscanf
没有将指针保留在缓冲区中。所以每次代码调用sscanf
时,它只是从缓冲区中获取第一个数字。结果是无限循环。
要解决此问题,您可以使用%n
转换说明符。 %n
返回转化使用的字符数。该数字(我在下面的代码中称为delta
)可用于将索引更新到缓冲区中。以下是其工作原理,每次调用sscanf
都会返回delta
。将delta
添加到index
,并在表达式index
中使用&buffer[index]
指向缓冲区中的下一个数字。
这里的结果代码是什么
// Load stdin into a buffer
char buffer[100];
if(fgets(buffer, sizeof(buffer), stdin) == NULL)
Handle_EOForIOError();
// Get a count of the numbers to create the array
int numIntegers = 0;
int index = 0;
int num, delta;
while(sscanf(&buffer[index], "%d%n", &num, &delta) == 1)
{
numIntegers++;
index += delta;
}
// Initialize the array with the proper size
int *numbers = malloc(numIntegers*sizeof(int));
// Load the integers into the array
index = 0;
for ( int i = 0; i < numIntegers; i++ )
{
if (sscanf(&buffer[index], "%d%n", &numbers[i], &delta) != 1)
ComplainBitterlyAndExit();
index += delta;
}