我尝试编写一个程序,将文本文件作为输入,然后使用用户输入进行二进制搜索。问题是,当我编译并运行它时,程序会自动退出并退出,并且永远不允许用户输入。
我怀疑它仍在以某种方式读取数据文件,但它应该用完了选项。有什么想法吗?
代码:
#include <stdio.h>
#include <stdarg.h>
int A[100];
char search;
int i, key, len, imin, imax, KEY_NOT_FOUND;
int result;
main() {
// Scan in array length.
scanf("%d", &len);
// Scan in array integers.
for(i = 0; i < len; i++) {
scanf("%d", &A[i]);
}
imin = 0;
imax = len - 1;
printf("Welcome to Binary Search!");
printf("\nDo you want to search for an integer? (y/n) ");
scanf("%c", &search);
while(search == 'y') {
printf("\nDo you want to search for an integer? (y/n) ");
scanf("%c", &search);
result = binary_search(*A, key, imin, imax);
printf("\n%d", result);
}
}
int binary_search(int *A, int key, int imin, int imax) {
// Test if array is empty
if(imax < imin)
// Set is empty, so return value showing not found.
return KEY_NOT_FOUND;
else {
// Calculate midpoint to cut set in half
int imid = midpoint(imin, imax);
// Three-way comparison
if(A[imid] > key)
// Key is in lower subset.
return binary_search(A, key, imin, imid - 1);
else if(A[imid] < key)
// Key is in upper subset.
return binary_search(A, key, imid + 1, imax);
else
// Key has been found.
return imid;
}
}
int midpoint(int imin, int imax) {
int imid = imax / 2;
return imid;
}
这是文本文件:
10
-144 -1 0 10 75 233 341 1000 8192 57885161
示例命令条目:
a.out < data.txt
示例输出:
Welcome to Binary Search!
Do you want to search for an integer? (y/n) y
Enter the Integer: 341
341 Found!
Do you want to search for an integer? (y/n) n
The End!
已编辑,因为答案没有考虑到问题。代码还没有打印 n found。
最佳答案
可能您的第一个问题是:
scanf("%c", &search);
%c 不会跳过空格(不像 %d),所以如果有
换行符或输入中尚未被吃掉的东西
点,然后 search
将不等于 'y',程序将退出。
当然还有其他问题,但这似乎是一个
导致困惑的立即退出。如果您使用编译器标志
要求尽可能多的警告,编译器可能会帮助你
发现一些其他问题...
就在您要读取“y”之前,您可以使用循环来吃掉所有非空白字符。例如:
while(scanf("%*[ \t\r\n]") > 0)
;
然后,您的程序将成功读取“y”,并继续到下一个将要崩溃的地方。 :-)
当然,这是假设您没有重定向标准输入。如果您已将 stdin 重定向到一个文件,那么该文件必须包含对 y/n 问题的答案。如果您确实希望将数据存储在一个文件中,但是以交互方式提出/回答问题,那么您将需要用户在命令行上向您传递文件名,使用 fopen 打开它,并使用结果句柄当您想从文件而不是键盘读取时。
关于c - 在 C 中使用文件作为输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19204015/