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

时间:2017-12-06 20:38:17

标签: c loops fgets

你好。我有一个问题,我创建的代码,以确定输入字符串是否是回文(如果读错方向,则字是相同的)。实际的代码本身可以正常工作,但是当我试图在整个代码上放置一个循环时,它开始表现得很奇怪。

#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] = '\0';

    } 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] = '\0';

    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()来消耗最终的换行符,但它没有解决我的问题。这是我得到的输出:

The output

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

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

1 个答案:

答案 0 :(得分:2)

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

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

cont = getchar();

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