C 可以假定我想存储哪个数组的字符吗?



我正在编写代码来检查数组是否为回文:

编写一个程序来读取消息,然后检查它是否是回文
(消息中的字母从左到右和从右到左相同(:

输入一条消息:他像魔鬼一样生活,嗯?
回文

输入一条消息:女士,我是亚当。
不是回文

当我输入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;
}

调用toupperisalpha的参数应转换为无符号字符类型。 否则,如果没有强制转换,通常这样的调用可以调用未定义的行为。

最好不要从输入的字符串数字中排除。因此,最好至少调用函数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,由于空格,它不是回文。那里为

  1. 将所有字母转换为大写或小写。
  2. 删除空格。
  3. 删除标点符号。
  4. 检查回文与否。

您可以使用# include <string.h>

  1. 第一件事是你必须使用接受带有空格的字符串的scanf()
printf("Enter a string = ");
scanf("%[^n]%*c", word);
  1. 然后你必须将该字符串转换为大写或小写,因为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++;
}
  1. 另一种情况是,如果您输入带有空格的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++;
}
  1. 最后一件事是我们必须恢复我们的字符串,并且需要检查我们的反转字符串是否等于我们的原始字符串。如果这是真的,我们的字符串是回文。如果它是假的,我们的字符串就不是回文。
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

相关内容

  • 没有找到相关文章

最新更新