[英]Palindrome Checker for strings in C
我是一名新的 CS 学生,我的回文函数有问题。 它可以很好地处理单个单词,也可以处理一些多单词,例如“race car”,尽管不是全部。 对于我的作业,我需要检查的单词之一是“dot i tod”,尽管我无法让回文正常工作。 我将不胜感激任何帮助! (假设单词之间只有一个空格并且所有单词都是小写的)
编辑:我意识到我应该把函数的开头放在里面,所以我现在就把它放在里面。
char sentence[20] = "dot i tod";
int len = strlen(sentence);
int i = 0;
int end = len;
char left[i];
char right[end];
while (i < len){
printf("%c ", sentence[i]);
printf("\n");
printf("%c ", sentence[len - i - 1]);
printf("\n");
if (left[i] == right[end - i - 1]){
i++;
end--;
}
if (left[i] == ' '){
i++;
}
if (right[end] == ' '){
end--;
}
if (left[i] != right[end]){
printf("Not a palindrome");
break;
}
if (i >= end){
printf("Palindrome");
break;
}
}
}
首先,这些声明
char left[i];
char right[end];
是不正确的,没有意义。 例如,您不能声明大小等于 0 的可变长度数组。
但是,如果不是变量left
和right
(即不是未初始化数组)使用的变量首句仍然程序的逻辑是不正确。
让我们假设字符串只包含一个字符,例如'A'
。
在这种情况下,if 语句中的条件计算为逻辑真
if (sentence[i] == sentence[end - i - 1]){ i++; 结尾 - ; }
因此,在i
的增量之后,它将指向终止零'\\0'
。 而在end
递减之后,它将指向第一个和单个字符 'A'。
之后这个 if 语句也将评估为逻辑真
if (sentence[i] != sentence[end]){ printf("不是回文"); 休息; }
因为现在 并且程序输出该字符串不是回文。
始终尝试编写更通用的函数。
例如,该函数可以如下所示。
#include <stdio.h>
#include <string.h>
#include <ctype.h>
int is_palindrome( const char *s )
{
const char *first = s, *last = s + strlen( s );
int success = 1;
do
{
while ( first != last && isspace( ( unsigned char )*first ) ) ++first;
while ( last != first && isspace( ( unsigned char )*--last ) );
if ( ( success = first != last && *first == *last ) ) ++first;
} while ( success && first != last );
return first == last;
}
int main(void)
{
const char *s1 = "race car";
const char *s2 = "dot i tod";
const char *s3 = " 1 2 3 2 1 ";
const char *s4 = " 1 2 33 2 1 ";
const char *s5 = " 1 2 34 2 1 ";
return 0;
}
程序输出是
"race car" is palindrome
"dot i tod" is palindrome
" 1 2 3 2 1 " is palindrome
" 1 2 33 2 1 " is palindrome
" 1 2 34 2 1 " is not palindrome
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.