你好。我创建的代码有问题,用于确定输入字符串是否是回文(如果以错误的方向读取,单词是相同的)。实际代码本身按预期工作,但是当我尝试在整个代码上放置一个循环时,它开始表现得很奇怪。
#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() 来消耗最终的换行符,但它没有解决我的问题。这是我得到的输出:
关于如何解决这个问题有什么想法吗?我是编程新手,我很想听听如何改进我的代码,尽管我现在主要关心的是解决这个循环问题。
编辑: 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/