我正在编写代码来检查数组是否为回文:
编写一个程序来读取消息,然后检查它是否是回文
(消息中的字母从左到右和从右到左相同(:输入一条消息:他像魔鬼一样生活,嗯?
回文输入一条消息:女士,我是亚当。
不是回文
当我输入He lived as a devil, eh?
时,
它给了我输出Not a palindrome
,
但实际输出应该是palindrome
。
下面的代码是我到目前为止尝试过的。
#include <stdio.h>
#include <ctype.h>
#define MAX_LEN 100
int main(void) {
char message[MAX_LEN];
char c, *p = message, *q;
printf("Enter a message: ");
while ((c = toupper(getchar())) != 'n' & p < message + MAX_LEN) {
if (isalpha(c))
*p++ = c;
}
p--;
for (q = message; q < p; q++, p--) {
if (*p != *q) {
printf("Not a palindromen");
return 0;
}
}
printf("Palindromen");
return 0;
}
对于初学者,您应该将变量c
声明为具有int
类型。用户可以中断输入过程,在这种情况下,函数getchar
返回整数值EOF
,您应该检查是否发生这种情况。
char *p = message, *q;
int c;
while 语句的条件中存在错误
while ((c = toupper(getchar())) != 'n' & p < message + MAX_LEN) {
代替按位运算符&
您必须使用逻辑 AND 运算符&&
。
正如我已经说过的,您应该检查 while 语句的条件,用户是否中断了输入。例如
while ( p < message + MAX_LEN && ( c = toupper(getchar())) != EOF && c != 'n') {
if (isalpha(c))
*p++ = c;
}
调用toupper
或isalpha
的参数应转换为无符号字符类型。 否则,如果没有强制转换,通常这样的调用可以调用未定义的行为。
最好不要从输入的字符串数字中排除。因此,最好至少调用函数isalnum
而不是函数isalpha
。
在这种情况下,用户可以输入一个空字符串,这是指针的递减
p--;
也可以调用未定义的行为。
当程序有一个点退出时会更好。
该程序可以如下所示
#include <stdio.h>
#include <ctype.h>
#define MAX_LEN 100
int main(void)
{
char message[MAX_LEN];
printf( "Enter a message: " );
char *p = message;
for ( int c; p < message + MAX_LEN && ( c = getchar() ) != EOF && c != 'n'; )
{
if( isalnum( ( unsigned char )c ) )
{
*p++ = toupper( ( unsigned char )c );
}
}
int palindrome = 1;
if ( p != message )
{
for ( char *q = message; palindrome && q < --p; ++q )
{
palindrome = *q == *p;
}
}
printf( "The entered message is %spalindromen",
palindrome ? "" : "not " );
return 0;
}
它的输出可能看起来像
Enter a message: He lived as a devil, eh?
The entered message is palindrome
或喜欢
Enter a message: Madam, I am Adam
The entered message is not palindrome
请注意,与其使用具有大量函数调用的循环getchar
不如只使用函数的一次调用fgets
fgets( message, sizeof( message ), stdin );
或
if ( fgets( message, sizeof( message ), stdin ) != NULL )
{
// check whether the entered string is a palindrome
}
在检查回文之前,您必须删除空格和标点符号。例如,如果您使用civic?
,则由于?
,它不是回文。另一方面,如果你使用civ ic
,由于空格,它不是回文。那里为
- 将所有字母转换为大写或小写。
- 删除空格。
- 删除标点符号。
- 检查回文与否。
您可以使用# include <string.h>
- 第一件事是你必须使用接受带有空格的字符串的
scanf()
。
printf("Enter a string = ");
scanf("%[^n]%*c", word);
然后你必须将该字符串转换为大写或小写,因为
a != A
.我们知道civic
是一个回文,但Civic
不是回文('Civic != civiC(,因为大写字母有不同的ASCII值,小写字母有不同的ASCII值。(a - z) -: 97 - 122
(A - Z) -: 65 - 90
就我而言,我已经将小写转换为大写。
while(strlen(word) >= i)
{
if(word[i] >= 97 && word[i] <= 122)
{
word[i] = word[i] - 32;
}
i++;
}
- 另一种情况是,如果您输入带有空格的
civ ic
,则回文词是ci vic
。你可以看到civ ic != ci vic
.在那里,您必须删除程序中的空格。而且你还必须删除标点符号,因为如果你使用civic,
它的反转词是,civic'. You can see
公民,!= ,civic'。
int len = strlen(word);
while(a < len)
{
for(i = 0; i < len; i++)
{
if(word[i] == ' ' || !(word[i] >= 'A' && word[i] <= 'Z'))
{
for(j = i; j < len; j++)
{
word[j] = word[j+1];
}
len--;
}
}
a++;
}
- 最后一件事是我们必须恢复我们的字符串,并且需要检查我们的反转字符串是否等于我们的原始字符串。如果这是真的,我们的字符串是回文。如果它是假的,我们的字符串就不是回文。
for(i = 0; i < len; i++)
{
if(word[i] == word[len - 1])
{
len--;
}
else
{
printf("%s is not a palindromen", word);
return 0;
}
}
printf("%s is a palindroemen", word);
这是合并上述部分后的完整代码
# include <stdio.h>
# include <string.h>
int main (void)
{
char word[100];
int i = 0;
int j, x = 0;
int a = 0;
printf("Enter a string = ");
scanf("%[^n]%*c", word);
while(strlen(word) >= i)
{
if(word[i] >= 97 && word[i] <= 122)
{
word[i] = word[i] - 32;
}
i++;
}
printf("After converting it to uppercase = %sn", word);
int len = strlen(word);
while(a < len)
{
for(i = 0; i < len; i++)
{
if(word[i] == ' ' || !(word[i] >= 'A' && word[i] <= 'Z'))
{
for(j = i; j < len; j++)
{
word[j] = word[j+1];
}
len--;
}
}
a++;
}
printf("After removing spaces = %sn", word);
for(i = 0; i < len; i++)
{
if(word[i] == word[len - 1])
{
len--;
}
else
{
printf("%s is not a palindromen", word);
return 0;
}
}
printf("%s is a palindroemen", word);
return 0;
}
第一次测试输出 -:
Enter a string = He lived as a devil, eh?
After converting it to uppercase = HE LIVED AS A DEVIL, EH?
After removing spaces = HELIVEDASADEVILEH
HELIVEDASADEVILEH is a palindroeme
第二次测试输出 -:
Enter a string = Madam I am Adam.
After converting it to uppercase = MADAM I AM ADAM.
After removing spaces = MADAMIAMADAM
MADAMIAMADAM is not a palindrome