此代码会在scanf()
之后立即阻止:
int main(int argc, char *argv[]) {
puts("Algorithms test kit");
long input_size;
FILE *output=fopen("output.txt","w+");
do {
printf("Enter sample size(0 goes on to next test) > ");
scanf (" %li ",&input_size);
printf ("#");
if (input_size==0) break;
int64_t *data=sorting_prepare_data(input_size);
int64_t *bsort_copy=calloc(input_size,8);
int64_t *qsort_copy=calloc(input_size,8);
memcpy(bsort_copy,data,input_size*8);
bubblesort(bsort_copy,input_size);
memcpy(qsort_copy,data,input_size*8);
quicksort(qsort_copy,input_size);
for (size_t i=0;i<input_size;i++) {
fprintf(output,"%lld\t%lld\t%lld\n",data[i],bsort_copy[i],qsort_copy[i]);
printf(".");
}
free(data); free(bsort_copy); free(qsort_copy);
} while (input_size);
return;
}
其中bubblesort()
和quicksort()
是各自算法的手写实现,sorting_prepare_data()
是一个辅助函数,在数组上调用自定义构建的PRNG。阻塞的可能原因是什么?该程序已使用GCC编译,未产生任何错误。
答案 0 :(得分:3)
我试过你的代码并设法重现奇怪的行为。如果您移除" "
周围的"%li"
,它就不会再阻止。
问题是空格,因为scanf
期望输入也匹配空白区域。
来自scanf
文档:
所有 转化由%(百分号)字符引入。格式字符串还可以包含其他字符。白色空间(如 格式字符串中的空格,制表符或换行符匹配任意数量的 输入中的空格,包括无空格。其他一切都匹配 只有它自己。当输入字符不匹配时,扫描停止 这样的格式字符。 输入转换时扫描也会停止 无法制作。