【发布时间】:2017-12-06 20:38:17
【问题描述】:
你好。我创建的用于确定输入字符串是否为回文的代码存在问题(如果以错误的方向阅读,单词是相同的)。实际代码本身按预期工作,但是当我尝试在整个代码上放置一个循环时,它开始表现得很奇怪。
#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()。
【问题讨论】:
-
附带问题:
for(i=0,j=0; i<strlen(inputString); i++,j++) { if (isalpha(inputString[i])) inputString[j] = ...是对strlen(inputString)的多次调用的低效代码。简单使用i<strlen(inputString)-->inputString[i] -
首先检查
fgets是否成功。该函数的返回值是有原因的。此外,fgets使用换行符,将其添加到字符串读取的末尾,当它成功时,如果所有输入都通过fgets,则后续getchar是没有保证的。 -
@chux 感谢您的反馈!我对 for 循环不是很熟悉,这到底是做什么的?因为我认为 for 循环需要某种形式的条件,例如 while i 小于 inputString 的长度。
-
@WhozCraig 对不起,如果我听起来很笨,但是我将如何检查 fgets 是否成功?如果没有成功,这意味着什么?
-
@user3121023 这会从根本上改变什么?因为我使用了
cont = getchar();,所以如果用户输入'y',代码就会循环。抱歉,如果我的问题看起来很愚蠢,我真的很想了解我在做什么。