你好。我有一个问题,我创建的代码,以确定输入字符串是否是回文(如果读错方向,则字是相同的)。实际的代码本身可以正常工作,但是当我试图在整个代码上放置一个循环时,它开始表现得很奇怪。
#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()。
答案 0 :(得分:2)
新行在缓冲区中留下的位置是在循环底部的getchar
调用之后。它只读取一个字符,因此换行符(以及您可能输入的任何额外字符)仍然保留。因此,当在下一次迭代中调用fgets
时,它只读取换行符。
您需要通过反复调用getchar
来清除循环底部的输入缓冲区,直到看到换行符:
cont = getchar();
int nextchar;
do {
nextchar = getchar();
} while (nextchar != '\n' && nextchar != EOF);