虽然循环过早退出

时间:2012-10-29 17:47:03

标签: c function while-loop dynamic-memory-allocation

所以这个程序应该是一个单词,以显示相同长度的有效单词。这是一项需要在函数内部进行动态内存分配并且相当混乱的赋值。在程序的开头,我必须为长度为n的字典动态分配内存。我们给出的字典长度为10000,单词的最大长度为20个字符。我选择动态创建每个单词的排列数组,然后将它们与字典中的单词进行比较,使用strcmp进行二进制搜索(用户输入的所有单词和字典中的所有单词均为大写,这使得这是一个可行的方法)。整个程序通过第一次迭代减去了有效单词和while循环过早退出的重复排列。我在while循环结束时使用函数Welcome()来询问用户是否想要解读另一个单词并打印该函数中的所有内容但不允许我扫描值以供选择。

其他一些规格:

  • 用户输入“y”或“Y”表示他们想要播放

我没有尝试过任何解决方法,因为我无法想到while循环会退出的任何原因。特别是因为即使我不允许扫描新值,选择仍应为“y”或“Y”。

这是主要的。

    int main() {


        char** dictionary;
        int num_words;

        // defined FILE* outside of file read in function to avoid returning local variable address
        FILE* ifp = fopen("Dictionary.txt", "r");

        fscanf(ifp, "%d", &num_words);

        dictionary = FileReadIn(num_words, ifp);

        char choice = Welcome();

        // main part of program Im unsure why it exits after its first iteration
        while ((choice == 'y') || (choice == 'Y')) {

            char* letters = LettersReadIn();

            // Calculates number of permutations which is (numletters)!
            long num_permutations = Factorial(strlen(letters));

            // Sets up permutations through malloc
            char** permutations = (char**)malloc((num_permutations) * sizeof(char*));

            int i;
            for (i = 0; i < num_permutations; i++) {
                permutations[i] = (char*)malloc(MAXWORDLENGTH * sizeof(char));
            }

            // Creates all permutations of the letters entered in by the user in a recursive function
           RecursivePermute(letters, 0, permutations);

           // Created the WordIndices array in order to keep track of which indices in the permutations array are valid words
           // Could not get the program to work when I created wordindices in Viable Words
           // Viable Words checks each permutation against words in the dictionary using a binary search 
           // which compared each word lexicographically with strcmp
           int* word_indices = (int*)malloc(num_permutations * sizeof(int));
           ViableWords(permutations, dictionary, num_permutations, num_words, word_indices);

           // Prints each index in permutations that is a valid word
           // valid word indices stored in word indices
           PrintWords(permutations, num_permutations, letters, word_indices);

           // frees permutations and word indices
           free(permutations);
           free(word_indices);

           choice = Welcome();
     } // End While loop

return 0;
} // End main

这是受欢迎的功能。

    char Welcome() {

         printf("Welcome to the Jumble Puzzle Solver!\n");
         printf("Would you like to enter a jumbled word?\n");

         char choice;
         scanf("%c", &choice);

   return choice;
   }// End Welcome

基本上我的问题是导致这种情况发生的原因以及解决方案。

如果您需要任何其他信息,请告诉我,如果您发现其他任何可以改进的信息,请告诉我。我对编程很新,所以我会喜欢一些建设性的批评。

2 个答案:

答案 0 :(得分:1)

原因是scanf在读取输入之后在输入缓冲区中留下换行符,在读取下一个字符之前未清除该输入缓冲区。

使用getchar()来使用换行符:

scanf("%c", &choice);
getchar(); 

或者告诉scanf()通过使用格式字符串中的前导空格来忽略输入缓冲区中的空格:

scanf(" %c", &choice);

答案 1 :(得分:0)

用更简单的

替换scanf
choice = fgetc(stdin)

你应该没事。

仅仅为了读取单个字符scanf有点过分,因为它适用于缓冲区。 当您写'q'并按输入时,换行符也会进入缓冲区,然后 %c检索一个字符,但换行符仍在缓冲区中