2017-02-22 5 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つの文字列を与えています:ユーザー入力が回文型かどうかを確認

レーダー

HOOTには余りにも熱い

マダム、私は男、計画、アダム

だ運河、パナマ

教えて、メモ、私は反対です!速さは決して肥満を防ぐことはできません。私はダイエットでダイエットする

私のプログラムは何らかの理由で、この5つのうち4つを渡します。さらに、私は非回文をテストしたところ、正常に動作するようです。下の画像は、ユーザ入力された5列の結果を示す:あなたが画像で見ることができるように他の文字列が予想される結果を提供しながら

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

、ストリング"A man, A plan, A canal-Panama"は、逆の結果を与えます。私のコードのどこがこれを引き起こしていますか?アドバイスや建設的な批判が本当に役に立ちます。

+1

これを試してデバッグするために何をしましたか?例えば。デバッガのステップスルー、中間結果の出力など...? –

答えて

0

あなたのコード例では、主な問題は2番目の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); 
    } 
} 

はところで、あなたのコード内の他のいくつかの問題がそこにいる、私はあなたがleetcode hereでは良い解決策を見てみることをお勧めします。

関連する問題