我正在尝试创建一个程序来检查给定的数组/字符串是否是回文并且它不起作用。程序只在每个给定的数组上打印“0”,即使是在回文中。
int main()
{
char string[100]= {0};
char stringReverse[100]= {0};
int temp = 0;
int firstLetter = 0;
int lastLetter = 0;
printf("Please enter a word or a sentence: ");
fgets(string, 100, stdin);
strcpy(stringReverse , string); // This function copies the scanned array to a new array called "stringReverse"
firstLetter = 0;
lastLetter = strlen(string) - 1; //because in array, the last cell is NULL
// This while reverses the array and insert it to a new array called "stringReverse"
while(firstLetter < lastLetter)
{
temp = stringReverse[firstLetter];
stringReverse[firstLetter] = stringReverse[lastLetter];
stringReverse[lastLetter] = temp;
firstLetter++;
lastLetter--;
}
printf("%s %s", stringReverse, string);
if ( strcmp(stringReverse , string) == 0)
{
printf("1");
}
else
{
printf("0");
}
}
答案 0 :(得分:5)
让我们说我们实现了一个简单的乐趣
int check_palindrome (const char *s) {
int i,j;
for (i=0,j=strlen(s)-1 ; i<j ; ++i, --j) {
if (s[i] != s[j]) return 0; // Not palindrome
}
return 1; //Palindrome
}
我认为这要简单得多;)
对于发布的代码: 注意fgets()。它在第一个'\ n'或EOF中停止,并保留'\ n'字符。
因此,如果您为ex提供雷达,则结果字符串将为“radar \ n”,这与“\ nradar”不匹配< /强>
答案 1 :(得分:2)
问题:
我们假设您输入字符串RACECAR
作为程序的输入并按Enter键,这会在缓冲区流中添加换行符或'\n'
,这也将作为一部分读取fgets
的字符串,因此您的程序最终会检查RACECAR\n
是否为回文,不是。
解决方案:
将lastLetter
初始化为strlen(string) - 1
后,检查字符串中的最后一个字符(或lastLetter
索引处的字符是否为换行符(\n
),如果所以,将lastLetter
减一,以便您的程序检查字符串的其余部分(RACECAR
)是否为回文。
lastLetter = strlen(string) - 1; //because in array, the last cell is NULL
// Add these 2 lines to your code
// Checks if the last character of the string read by fgets is newline
if (string[lastLetter] == '\n')
lastLetter--;
答案 2 :(得分:1)
fgets
在最后添加'\ n'。
因此,如果用户输入“aba”,string
包含“aba \ n”。
reverseString
包含“\ naba”。
所以它不匹配。
在fgets之后,添加此代码
int l = strlen(string) - 1;
string[l] = 0;
这将在结束前删除'\ n',然后再将其复制到reverseString
。
除此之外,您可以在不需要第二个缓冲区或strcpy
或strlen
来电的情况下完成整个程序。
答案 3 :(得分:1)
您的代码中有几个问题:
}
; \n
中的尾随\r
(或者也可能是string
); 这是一个有效的代码:
#include <stdio.h>
#include <string.h>
int main()
{
char string[100]= {0};
int temp = 0;
int firstLetter = 0;
int lastLetter = 0;
printf("Please enter a word or a sentence: ");
fgets(string, 100, stdin);
firstLetter = 0;
lastLetter = strlen(string) - 1; //because in array, the last cell is NULL
while ((string[lastLetter]=='\n')||(string[lastLetter]=='\r')) {
lastLetter--;
}
// This while reverses the array and insert it to a new array called "stringReverse"
temp = 1;
while(firstLetter < lastLetter)
{
if (string[firstLetter] != string[lastLetter]) {
temp = 0;
break;
}
firstLetter++;
lastLetter--;
}
if ( temp )
{
printf("1");
}
else
{
printf("0");
}
}
答案 4 :(得分:0)
你也可以通过这种简单的方式来做到这一点。
#include <stdio.h>
#include <string.h>
int main()
{
char string[10], revString[10];
printf("Enter string for reversing it...\n");
scanf("%s", string);
int stringLength = strlen(string);
for(int i = 0; string[i] != '\0'; i++, stringLength--)
{
revString[i] = string[stringLength - 1];
}
if(strcmp(string, revString) == 0)
printf("Given string is pelindrom\n");
else
printf("Given string is not pelindrom\n");
}
答案 5 :(得分:0)
#include<stdio.h>
#include<string.h>`enter code here`
void fun(char *a);
int main ()
{
char p[100];
char *s=p;
printf("enter the string");
scanf("%[^\n]",s);
fun(s);
}
void fun(char *a)
{
if(*a && *a!='\n')
{
fun(a+1);
putchar(*a);
}
}
// 使用这种方法更好的时间复杂度和更容易的工作希望这会有所帮助