0

我试图编写一个程序,它将文本文件作为输入,然后使用用户输入进行二进制搜索。问题是,当我编译并运行它时,程序会自动退出并退出,并且不允许用户输入。

我怀疑它仍在以某种方式读取数据文件,但它应该已经没有选项了。有任何想法吗?

编码:

#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 yet。

4

3 回答 3

2

可能您最直接的第一个问题是:

 scanf("%c", &search);

%c 不会跳过空格(与 %d 不同),因此如果输入中有换行符或其他内容在该点尚未被吃掉,那么search将不等于 'y',程序将退出。当然还有其他问题,但这似乎是导致令人困惑的立即退出的问题。如果您使用要求尽可能多的警告的编译器标志,编译器可能会帮助您找到其他一些问题......

就在你想读'y'之前,你可以使用一个循环来吃掉所有的非空白字符。例如:

while(scanf("%*[ \t\r\n]") > 0)
    ;

然后,您的程序将成功读取“y”,并继续到下一个它将崩溃的地方。:-)

当然,这假设您没有重定向标准输入。如果您已将标准输入重定向到文件,则该文件必须包含对 y/n 问题的答案。如果您确实希望将数据存储在文件中,但以交互方式询问/回答问题,那么您将需要用户在命令行上向您传递文件名,使用 fopen 打开它,并使用生成的句柄当您想从文件而不是键盘读取时。

于 2013-10-06T01:12:59.807 回答
1

首先,您的程序不会等待用户输入。getchar();在scanf末尾添加main()或稍作修改:

printf("\nDo you want to search for an integer? (y/n) ");
scanf(" %c", &search);
     //^ added space 

接下来,您的程序没有读取文件 - 按照上面/下面的说明实现它。

于 2013-10-06T00:37:30.343 回答
0

要从 C 中的文件中读取,您应该使用类似的东西:

FILE *inputfile;
char *mode = "r"; //we use r because you just want to read file
inputfile = fopen("YOURFILENAME", mode);

之后,您可以使用“fscanf”函数从文件中读取值:

fscanf(inputfile, "%d", &len); 

完成文件读取后,只需编写:

fclose(inputfile); 
于 2013-10-06T00:33:05.337 回答