[英]C Program to Check for Palindrome String
我編寫了兩個示例程序來檢查回文字符串。 但是在我得到的輸出中,它不是回文數。 我缺少什么?
我嚴格假設代碼以某種方式執行我的 if 語句並將標志放入 1。可能是因為長度計算。 有人有更好的主意嗎?
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
int main(void) {
setbuf(stdout,NULL);
char name[100];
int i,length,flag=0,k;
printf("Enter your name");
/*scanf("%s",name);*/
gets(name);
length=strlen(name);
for(i=0;i<=length-1;i++)
{
for(k=length-1;k>=0;k--)
{
if(name[i]!=name[k])
{
flag=1;
break;
}
}
}
if(flag==0)
{
printf("Give word is a palindrome");
}
if(flag==1)
{
printf("This is NOT a palindrome word");
}
return 0;
}
和
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
int main(void) {
setbuf(stdout,NULL);
char name[100];
int i,length,flag=0;
printf("Enter your name");
/*scanf("%s",name);*/
gets(name);
length=strlen(name);
for(i=0;i<=length/2;i++)
{
if(name[i]!=name[length-1])
{
flag=1;
}
}
if(flag==0)
{
printf("Give word is a palindrome");
}
if(flag==1)
{
printf("This is NOT a palindrome word");
}
return 0;
}
您在第一個程序中使用的算法涉及將每個字母與每個其他字母進行比較,這無助於確定數字是否為回文,並且似乎無法修復。
然而,第二種方法的問題是您總是將name[i]
與name[length]
。 而是將其更改為length-i-1
。 這將從length-1
開始比較,並在每次下一次迭代時將字符的長度減 1:
for(i = 0;i <= length / 2;i++)
{
if(name[i] != name[length-i-1])
{
flag=1;
break;
}
}
gets()
和緩沖區溢出不要使用gets
。 此方法易受緩沖區溢出的影響。 如果您輸入的字符串長度超過 100 個字符,則會導致未定義的行為。 使用fgets
代替確定性行為:
fgets(name, sizeof(name), stdin);
這需要緩沖區的大小,並且最多只能讀取sizeof(name)
字符。
理想情況下,您應該考慮包裝邏輯以檢查字符串是否為函數中的回文:
int is_palindrome(char*);
int main(void)
{
char name[100];
setbuf(stdout,NULL);
printf("Enter your name");
fgets(name, sizeof(name), stdin);
if(is_palindrome(name))
{
printf("The given word is a palindrome");
}
else
{
printf("This is NOT a palindrome word");
}
return 0;
}
int is_palindrome(char* name)
{
int length = strlen(name);
int flag = 0, i;
for(i = 0;i <= length / 2; i++)
{
if(name[i]!=name[length-i-1])
{
return 0;
}
}
return 1;
}
試試這個
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main() {
char text[100];
int begin, middle, end, length = 0;
printf("enter the name: ");
scanf("%s",text);
while ( text[length] != '\0' ){
length++;}
end = length - 1;
middle = length/2;
for ( begin = 0 ; begin < middle ; begin++ ) {
if ( text[begin] != text[end] ) {
printf("Not a palindrome.\n");
break;
}
end--;
}
if( begin == middle )
printf("Palindrome.\n");
return 0;
}
第一段代碼的問題是您比較的次數超過了要求,將其與length-i-1
進行比較。
第二個代碼的主要問題是您僅將其與單詞的最后一個字母進行比較。
希望你明白你的錯誤
你的兩次嘗試都有很多錯誤。 我強烈建議使用調試器來調查您的代碼如何工作(或不工作)。
您的第一次嘗試執行length
2 (不正確)比較,顯然只需要length / 2
比較。 第二個執行length / 2
比較,但比較不正確:
name[i] != name[length-1] ;
應該:
name[i] != name[length - i - 1] ;
最后,當您知道它們不是回文時(在第一次不匹配時)可以終止比較時,您將進行徹底迭代。
可能還有其他錯誤 - 老實說,我沒有比明顯的更進一步,因為有更好的解決方案。
建議:
#include <stdbool.h>
#include <string.h>
bool isPalindrome( const char* str )
{
bool is_palindrome = true ;
size_t rev = strlen( str ) - 1 ;
size_t fwd = 0 ;
while( is_palindrome && fwd < rev )
{
is_palindrome = (str[fwd] == str[rev]) ;
fwd++ ;
rev-- ;
}
return is_palindrome ;
}
正在使用:
int main()
{
const char* test[] = { "xyyx", "xyayx", "xyxy", "xyaxy" } ;
for( size_t t = 0; t < sizeof(test)/sizeof(*test); t++ )
{
printf("%s : %s palindrome\n", test[t],
isPalindrome( test[t] ) ? "Is" : "Is not" ) ;
}
return 0;
}
輸出:
xyyx : Is palindrome
xyayx : Is palindrome
xyxy : Is not palindrome
xyaxy : Is not palindrome
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.