2016-10-06 12 views
1

문장이 회문인지 아닌지 확인하려고합니다. 공간이나 문장 부호는 중요하지 않습니다.왜 palindrome을 검사 할 때 palindrome 검사 기능이 항상 false를 반환합니까?

예 :

• 절대로 홀수 남자 운하 파나마 계획 •도

. Gateman 이름을보고

•은 garageman이 문장의 이름 태그를

Netheir을보고 내 코드에 진정한 전달합니다. 처음에는 공백을 제거하고 구두점을 제거하고 아래쪽에있는 위 문자를 변환하려고합니다.

int palindrome(char *str){ 
    int n,n2 = 0,i,j=0; 
    n = sizeof(str)/sizeof(char); 
    char nova[n]; 

    for (i=0;i< n;i++){ 
     if(str[i] >= 'A' && str[i] <= 'Z'){ 
      nova[n2] = ('a' + str[i] - 'A'); 
      n2++; 
     } 
     else if(str[i] >= 'a' && str[i] <= 'z'){ 
      nova[n2] = str[i]; 
      n2++; 
     } 
    } 

    i=0; 
    while (i < n2-1){ 
     if (nova[i]!= nova[j]){ 
      return 0; 
     } 
     i++; 
     j--; 
    } 

    return 1; 
} 
+4

시작 .. –

+0

... 대'나 strlen (STR)'. – WhozCraig

+0

나는 strlen()을 사용할 수 없다. –

답변

0

기존 답변은 좋지만 할당 된 추가 메모리를 사용하지 않고도이 문제를 해결할 수있는 또 다른 방법이 있습니다. 비교하기 위해 어디서든 문자를 저장할 필요가 없습니다. 원래 문자열에 대한 포인터를 사용할 수 있습니다. `는 sizeof (캐릭터가)`무엇을 알아내는와

int palindrome(char *str) 
{ 
    int i = 0, j = strlen(str); 
    while (i < j) 
    { 
     if (str[j] == '\0' || !isalpha(str[j])) 
      --j; // skip the character on the right if it's not a letter 
     else if (!isalpha(str[i])) 
      ++i; // skip the character on the left if it's not a letter 
     else if (tolower(str[i]) != tolower(str[j])) 
      return 0; // letters are different? - not a palindrome 
    } 
    // all letters were equal? - a palindrome 
    return 1; 
} 
+0

그 해결책은 더 좋습니다.하지만이 기능에 이미 정의 된 기능을 사용할 수는 없습니다. 케이스. –

+0

이 답변에 문제가 있으면'isalpha()'를 호출 할 때 공백이 true로 평가됩니다. – user3629249

3

행 4 : sizeof에 의해 요소 수를 얻고 싶습니다.

그러나 인수를 포인터로 함수에 전송하면.

n = sizeof(str)/sizeof(char); 

n은 32 비트 플랫폼에서 항상 4입니다. 대신에, 문자열 형식 인 경우

n = strlen(str) 

(필요 : #include <string.h>)을 사용하십시오.

+0

나는 포인터 크기에 플랫폼의 비트를 연관시키지 않을 것이다. ... –

0

좋아, 이제 모든 수정과 함께 작동합니다. 고마워.

int palindrome(char *str) 
{ 
int n =0,i=0,j; 
char nova[100]; 

while(str[i]!= '\0'){ 
    if(str[i] >= 'A' && str[i] <= 'Z'){ 
     nova[n] = ('a' + str[i] - 'A'); 
     n++; 
    } 
    else if(str[i] >= 'a' && str[i] <= 'z'){ 
     nova[n] = str[i]; 
     n++; 
    } 
    i++; 
} 

i=0; 
j= n-1; 
while (i< j){ 
    if (nova[i]!= nova[j]){ 
     return 0; 
    } 
    i++; 
    j--; 
} 

return 1; 
} 
+0

문자열이 100 자보다 길 때이 코드는 작동하지 않는다. – user3629249

+0

있다 (영문). EBCDIC 같은 다른 문자 집합. 질문에 ASCII 문자 집합이 사용되는 요구 사항이 명시되어 있지 않으므로이 대답은 ASCII 이외의 다른 문자로는 실패합니다. – user3629249