C 中 do-while 循环内的 fgets() 问题

Issue with fgets() inside of a do-while loop in C

你好。我创建的用于确定输入字符串是否为回文的代码有问题(如果以错误的方向读取,单词是相同的)。实际代码本身按预期工作,但是当我尝试在整个代码上循环时,它开始表现得很奇怪。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

#define STRING_MAX 100

int isPalindrome();
char* removeNonAlpha();
char* strLowerCase();

int main()
{
    int x = 0;
    char inputString[STRING_MAX];
    char cont='y';

    do
    {
        printf("Hello. Please enter a word or sentence: ");
        fgets(inputString, STRING_MAX, stdin);

        printf("You entered: %s\n", inputString);

        //Remove all non alphabetical symbols from the string
        removeNonAlpha(inputString);
        printf("First we have to remove everything non-alphabetical: %s\n", inputString);

        //Make sure all the alphabetical symbols are lower case
        strLowerCase(inputString);
        printf("Then we have to make everything lower-case: %s\n", inputString);

        //After that, check if the string is a palindrome
        x = isPalindrome(inputString);

        if(x)
        {
            printf("The string you entered is a palindrome! :D\n");
        }
        else
        {
            printf("The string you entered is not a palindrome... :|\n");
        }
        printf("Would you like to enter another word or sentence? (y/n): ");
        cont = getchar();

        inputString[strlen(inputString)-1] = '[=10=]';

    } while (cont == 'y');

    return 0;
}

int isPalindrome(char inputString[])
{
    int l = 0, r = strlen(inputString) - 1;

    if (l == r)
        return 1;

    while (r > l)
    {
        if (inputString[l++] != inputString[r--])
            return 0;
    }
    return 1;
}

char* removeNonAlpha(char inputString[])
{
    int i, j;

    for(i=0,j=0; i<strlen(inputString); i++,j++)
    {
        if (isalpha(inputString[i]))
            inputString[j] = inputString[i];
        else
            j--;
    }
    inputString[j] = '[=10=]';

    return inputString;

}

char* strLowerCase(char inputString[])
{
    int i;

    for(i=0; i<strlen(inputString); i++)
        inputString[i] = tolower(inputString[i]);


    return inputString;
}

所以我期望的是代码再次 运行 并要求输入另一个字符串,但它没有。我阅读了一些关于此的内容,看起来正在发生的事情是换行符 (\n) 仍在输入缓冲区中并且跳过了 fgets。我尝试在 fgets 之后使用 getchar() 来使用最终的换行符,但它没有解决我的问题。这是我得到的输出:

关于如何解决这个问题有什么想法吗?我是编程新手,我很想听听如何改进我的代码,尽管我现在主要关心的是解决这个循环问题。

编辑: string.h 中唯一允许我使用的函数是 strlen()。

换行符留在缓冲区中的位置是在循环底部的 getchar 调用之后。它只读取一个字符,所以换行符(以及您可能输入的任何额外字符)仍然存在。因此,当在下一次迭代中调用 fgets 时,它只读取换行符。

您需要通过重复调用 getchar 直到看到换行符来清除循环底部的输入缓冲区:

cont = getchar();

int nextchar;
do {
    nextchar = getchar();
} while (nextchar != '\n' && nextchar != EOF);