2010-03-01 21 views
5

मैं संभावित साक्षात्कार के सवालों के माध्यम से काम कर रहा हूं और उनमें से एक सी में एक समारोह लिखना था यह पता लगाने के लिए कि कोई दिया गया स्ट्रिंग एक पालिंड्रोम था या नहीं।मैं सी में पैलिंड्रोम का पता कैसे लगा सकता हूं?

मैं इस पर एक बहुत अच्छी शुरुआत मिल गया है:

#include <stdio.h> 
#include <stdbool.h> 

bool isPalindrome(char *value); 

bool isPalindrome(char *value) 
{ 
    if (value == null) 
     return false; 

    char *begin = value; 
    char *end = begin + strlen(value) - 1; 

    while(*begin == *end) 
    { 
     if ((begin == end) || (begin+1 == end)) 
      return true; 

     begin++; 
     end--; 
    } 

    return false; 
} 


int main() 
{ 
    printf("Enter a string: \n"); 
    char text[25]; 
    scanf("%s", text); 

    if (isPalindrome(text)) 
    { 
     printf("That is a palindrome!\n"); 
    } 
    else 
    { 
     printf("That is not a palindrome!\n"); 
    } 
} 

हालांकि, मैं अब यह सुनिश्चित करें कि मैं रिक्त स्थान और विराम चिह्नों पर ध्यान चाहते हैं।

ऊपर दिए गए कोड को दिए गए कोड को आगे बढ़ाने के लिए सबसे अच्छा तरीका क्या है, पॉइंटर्स को आगे या पीछे अग्रेषित करने के लिए उन्हें विराम चिह्न/रिक्त स्थान का सामना करना चाहिए?

+0

यह एक स्कूल होमवर्क है के लिए चेक जोड़ा? –

+3

@Jojo, जाहिर है आप इस सवाल को पढ़ने के लिए परेशान नहीं थे। – Waldrop

उत्तर

5

परिवर्तन

while(begin < end) { 
    while(ispunct(*begin) || isspace(*begin)) 
    ++begin; 
    while(ispunct(*end) || isspace(*end)) 
    --end; 
    if(*begin != *end) 
    return false; 
    ++begin; 
    --end; 
} 
return true; 
+3

+1 लेकिन 'ispunct (x) के बजाय || जारीस्थान (एक्स) 'मैं शायद '! isalpha (x)' का उपयोग करेंगे। यह थोड़ा अलग है, लेकिन मेरी राय में आंखों पर थोड़ा सा आसान है। –

+3

यह पूरी तरह से विराम चिह्न (दूसरों के बीच) से बना एक स्ट्रिंग पर असफल हो जाएगा। विराम चिह्न छोड़ते समय आपको 'एंड' और 'स्टार्ट' एक दूसरे को पास नहीं करते हैं, यह सुनिश्चित करने के लिए आपको उन लूपों में अधिक चेक की आवश्यकता है। – caf

+0

@caf, 'ispunct (0) 'गलत है, इसलिए' स्टार्ट 'ठीक होगा - आपको' end 'की रक्षा करने वाले' if' में' && (end> value) 'जोड़ने की आवश्यकता है, हालांकि। –

0

के पाश कैसे अंतरिक्ष और एक स्ट्रिंग में विराम चिह्न वर्ण दूर करने के लिए एक और समारोह लिखने के बारे में?

+2

ठीक है, मैं यह कर सकता था। मुझे लगता है कि ऐसा लगता है कि अगर मैं पॉइंटर को आगे बढ़ाकर उन्हें खाया तो यह और अधिक समझ में आया। – Waldrop

+0

सहमत; यदि आपको आवश्यकता नहीं है तो एक नई प्रतिलिपि स्ट्रिंग के लिए स्थान आवंटित नहीं करना निश्चित रूप से बेहतर है। –

3

जबकि पाश अंदर, बस किसी भी वर्ण आप अनदेखा करना चाहते छोड़:

while(*begin == *end) 
{ 
    while ((begin != end) && (isspace(*begin) || isX(*begin)) 
     ++begin; 

    // and something similar for end 

एक अन्य टिप्पणी। अपने समारोह पैरामीटर को संशोधित नहीं किया गया है के बाद से, आप के रूप में यह परिभाषित करना चाहिए:

bool isPalindrome(const char *value); 
+0

+1: हस्ताक्षर में "const" जोड़ने के लिए। उसी सिद्धांत पर, "कॉन्स्ट चार * शुरू करें" और "कॉन्स चार * अंत"! – Arun

0

जाँच करने के लिए इस निम्न उदाहरण देखें कि क्या स्ट्रिंग विलोमपद

 

main() 
{ 
     char str[100] ; 
     printf ("enter string:"); 
     scanf ("%s" ,str) ; 
     if (ispalindorm(str)) 
     { 
       printf ("%s is palindrome \n"); 
     } 
     else 
     { 
       printf ("%s is not a palindrome \n") ; 
     } 
} 
int ispalindorm ( char str[]) 
{ 
     int i , j ; 
     for (i=0,j=strlen(str)-1;i < strlen(str)-1&& (j>0) ;i++,j--) 
     { 
       if (str[i] != str[j]) 
         return 0 ; 
     } 
     return 1 ; 
} 
+0

@pavun_cool, आपने सवाल नहीं पढ़ा। यह समाधान रिक्त स्थान या विराम चिह्न को बिल्कुल संभाल नहीं करता है। – Waldrop

0

यहाँ उस पर मेरी ले है संक्षेप में रहने की कोशिश की। इसके अलावा, बस कोई इनपुट

#include <stdio.h> 
#include <string.h> 

int p_drome(char *c) { 
    int beg=0, end = strlen(c)-1; 
    for (;c[beg]==c[end] && beg<strlen(c)/2;beg++,end--); 
    return (beg == strlen(c)/2) ? 1 : 0; 
} 

int main(int argc, char* argv[]) { 
    argv[1]?(p_drome(argv[1])?printf("yes\n"):printf("no\n")):printf("no input\n"); 
} 
0
/* you can use this code to check the palindrome*/  
#include<stdio.h> 
    #include<string.h> 
    int is_pali(char str1[]); 
    int is_pali(char str1[]) 
    { 
     char str2[100]; 
     int n,i; 
     n = strlen(str1); 
     for(i=0;i<n;i++) 
     str2[n-1-i] = str1[i]; 
     if(str1[i]=str2[i]) 
     return 0; 
     else 
     return 1; 
    } 
    int main() 
    { 
     char str1[100]; 
     int temp; 
     printf("Enter the string\n"); 
     gets(str1); 
     temp = is_pali(str1); 
     if (temp==0) 
     printf("the given string is not palindrome\n"); 
     else 
     printf("the given string is palindrome\n"); 
    } 
-1
#include<stdio.h> 
    #include<string.h> 
int main() 
{ 
char str[20]; 

int i,j,k,m,n; 
printf("enter the string\n"); 
scanf("%s",str); 
printf("%s",str); 
k=strlen(str); 
printf("\nthe lenght of string is %d",k); 

for(i=0;i<k/2;i++) 
{ 
    m=str[i]; 
    n=str[k-1-i]; 
}if(m==n) 
{ 

printf("\nthe given string is palindrome");   
} 
else{ 
printf("\nthe given string is not a palindrome"); 
     } 
return 0; 

}

संबंधित मुद्दे