2017-02-22 3 views
-1
#include <iostream> 
#include <cstring> 
#include <string> 
#include <ctype.h> 
using namespace std; 

//declare methods 
void transform(char *, char *); 
bool testPalindrome(char *); 


int main() 
{ 
    //declare c-strings and a boolean variable 
    char str[80]; 
    char myStr[100]; 
    char defaultValue[] = "0"; 
    bool done = true; 

    //continously ask a user to enter a string until the user enters 0 
    while (done) 
    { 
     cout << "Enter a string (0 to exit the program): "; 
     cin.getline(str, 80); 
     if (strcmp(str,defaultValue) == 0) 
     { 
      done = false; 
     } 
     else 
     { 
      //convert all lowercase letters of user input to uppercase 
      transform(str, myStr); 

      //test if user input is the same when read backward and forward 
      if (testPalindrome(myStr)) 
      { 
       cout << "It is a palindrome." << endl; 
      } 
      else 
      { 
       cout << "It is not a palindrome." << endl; 
      } 
     } 
    } 
    system("pause"); 
    return 0; 
} 
/* 
This method converts all lowercase letters into uppercase letters 
as well as removes characters that are not numbers or letters. 
The new string will be stored in the C-string testStr 
*/ 
void transform(char * raw, char * testStr) 
{ 
    int length = strlen(raw); 
    int j = 0; 

    //convert all lowercase letters to uppercase letters if current letter  is lowercase 
for(int i = 0; i < length; i++) 
{ 
    if (islower(raw[i])) 
    { 
     raw[i] = toupper(raw[i]); 
    } 

} 
//copy user input, remove all characters that are letters or numbers 
for (int k = 0; k < length; k++) 
{ 
    if ((isalpha(raw[k]) || isdigit(raw[k]))) 
    { 
     *(testStr + k) = *(raw + k); 
    } 
    else if (isspace(raw[k])) 
    { 
     const char * current = &raw[k]; 
     remove(current); 
    } 
    j++; 
} 
*(testStr + j) = '\0'; 
} 
/* 
This method determines if the user input can be read the same backward or  forward. 
will take a parameter of a pointer variable, which refers to 
memory address of the c-string 
*/ 
bool testPalindrome(char * str) 
    { 
     int test = 1; 
     bool flag = true; 
     int length = strlen(str) - 1; 
     int n = length; 
     for (int i = 0; i <= length && n >= 0; i++, n--) 
     { 
      if (toupper(str[i]) == toupper(str[n])) 
      { 
        flag = true; 
      } 
      else 
      { 
       flag = false; 
      } 
     } 
    return flag; 
} 

이 프로그램에서는 사용자 입력이 회문인지 여부를 표시하려고합니다. 나는 시험에 5 문자열을 제공하고있다 :사용자 입력이 회문인지 확인

레이더

야유 너무 뜨거운

부인 나는 남자, 설계도하는 아담

해요 운하 파나마

!

의사, 메모, 반대! 금식은 결코 비만을 예방하지 않습니다. 대구 식단 다이어트

어떤 이유로 든 내 프로그램에서 5 가지 경우 중 4 가지를 전달합니다. 또한, 나는 비 회문을 테스트했고 그것은 정상적으로 작동하는 것 같습니다. 다른 캐릭터가 예상 결과를 제공하면서

이미지에 보이는 바와 같이

https://i.stack.imgur.com/cYmHe.png

는 문자열 "A man, A plan, A canal-Panama"는 반대 결과를 제공한다 : 다음 이미지 5 문자열 인 사용자 입력의 결과를 나타낸다. 내 코드에서이 문제의 원인은 어디입니까? 조언 및/또는 건설적인 비판이 실제로 도움이 될 것입니다.

+1

이 디버깅을 시도하고 디버깅하기 위해 수행 한 작업은 무엇입니까? 예 : 디버거 단계별, 중간 결과 출력 등 ...? –

답변

0

예를 들어, 주요 문제는 두 번째 for 루프 변환 방법입니다. 다음은 고정 버전입니다.

// copy str, remove all characters that are NOT letters or numbers 
for (int k = 0; k < length; k++) 
{ 
    if ((isalpha(raw[k]) || isdigit(raw[k]))) 
    { 
     *(testStr + j++) = *(raw + k); 
    } 
} 

가, BTW 코드에서 여러 가지 다른 문제가있어, 난 당신이 leetcode here에서 좋은 솔루션을 살펴하는 것이 좋습니다.