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