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

标签 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()。

最佳答案

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

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

cont = getchar();

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

关于c - C 中 do-while 循环内的 fgets() 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47683070/

相关文章:

c - 4 个子进程之间的管道通信仅在第一次有效

c - 如何在不添加 printfs 的情况下在调用函数时打印函数名称?

php - 为数组中的每个项目循环 MySQL-Query 10 次(PHP 和 MySQL)

c - 使用 fgets 读取从 START 到 STOP 字符串的所有文件字符

c - 查找除以空格的单词

c - 如何在c中没有for循环的情况下将用户输入存储在数组中

c - 内存数据文件中的SQLite3

javascript - 将数组传递给 JavaScript 中具有循环的函数

c - 难倒 : for loop to build an array not working, 忽略初始条件?

c - 用于输入的 fgets()/sscanf 在功能上运行良好。当 fnct 离开并返回时,stdin 中是否有额外的输入/行?