我的C程序有些挣扎! 它应该检查一个字符串是否是回文!它不应该注意非字母字符,所以程序应该认为这是一个回文! “他像魔鬼一样生活,呃?” 这就是我到目前为止所得到的:
#include <stdio.h>
#include <stdlib.h>
int main()
{
char sentence[39];
int left = 0;
int right = 40;
printf("Enter a message: ");
fgets(sentence, 40, stdin);
while(1) {
while(left < right && !(isalpha(sentence[left])))
left++;
while(right > left && !(isalpha(sentence[right])))
right--;
if(left >= right)
break;
else {
if(sentence[left] != sentence[right]) {
printf("Not a Palindrome");
return 0;
}
left++;
right--;
}
}
printf("Palindrome");
return 0;
}
它总是打印:不是PALINDROME! 即使它是一个。
答案 0 :(得分:1)
我对您的计划进行了一些更改。首先不要破坏数组索引,接下来使用字符串长度而不是访问未定义的值,第三次检查相同的大小写字母。
#include <stdio.h>
#include <string.h>
#include <ctype.h>
int main()
{
char sentence[200]; // provide plenty of room
int left = 0;
int right; // do not assume the length
printf("Enter a message: ");
fgets(sentence, sizeof sentence, stdin); // limit the input
right = strlen(sentence); // now get the length
while(1) {
while(left < right && !(isalpha(sentence[left])))
left++;
while(right > left && !(isalpha(sentence[right])))
right--;
if(left >= right)
break;
else {
if(toupper(sentence[left]) != toupper(sentence[right])) { // get case the same
printf("Not a Palindrome\n");
return 0;
}
left++;
right--;
}
}
printf("Palindrome\n");
return 0;
}
计划会议:
Enter a message: He lived as a devil, eh? Palindrome Enter a message: palindrome Not a Palindrome
答案 1 :(得分:1)
您可以编写一个单独的函数来检查输入的句子是否是回文。
至于你的代码那么这些陈述
char sentence[39];
int left = 0;
int right = 40;
printf("Enter a message: ");
fgets(sentence, 40, stdin);
导致未定义的行为,因为当您尝试输入40个字符时,数组句子只有39个元素。输入的字符串也可以包含40个以上的字符。您需要确定字符串的长度。
这是一个演示程序,显示如何编写相应的函数。
#include <string.h>
#include <ctype.h>
#include <stdio.h>
int is_palindrome(const char *s)
{
size_t n = strlen(s);
const char *first = s, *last = s + n;
if (n)
{
do
{
while ( *first && !isalpha((unsigned char)*first)) ++first;
if (first != last)
{
while (!isalpha((unsigned char)*--last));
}
} while ( toupper( ( unsigned char )*first ) ==
toupper( ( unsigned char )*last ) &&
first != last &&
++first != last);
}
return first == last;
}
#define N 100
int main()
{
while (1)
{
char s[N];
printf("Enter a sentence (Enter - exit): ");
if (!fgets(s, sizeof(s), stdin) || s[0] == '\n') break;
printf("\nThe sentence is%s palindrome.\n\n",
is_palindrome(s) ? "" : " not");
}
return 0;
}
它的输出可能看起来像
Enter a sentence (Enter - exit): He lived as a devil, eh
The sentence is palindrome.
Enter a sentence (Enter - exit):
答案 2 :(得分:0)
您应该将权限初始化为字符串的结尾:
#include <string.h>
// ...
right = strlen(sentence) - 1;
答案 3 :(得分:0)
你可以使用这种代码格式
#include <stdio.h>
#include <string.h>
int main()
{
int length = 0;
int i = 0;
int count = 0;
char data[100] = "ABCDEDCBA";
length = strlen(data);
printf("length is %d\n", length);
while (i < length)
{
if (data[i] != data[length - i - 1])
{
count = 1;
}
i++;
}
if (count == 1)
{
printf(" not palindrome");
}
else
{
printf("palindrome");
}
return 0;
}