2017-02-22 13 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 строк для теста:Определите, является ли пользовательский ввод палиндром

Радар

Слишком жарко, чтобы гудеть

Madam Я Адам

Человек, план, Канал-Panama

!

Док, заметьте, я инакомыслящий! Быстрое никогда не предотвращает жирность; I диета на трески

По какой-то причине моя программа проходит 4 из этих 5 случаев. Кроме того, я тестировал не-палиндромы, и, похоже, он работает нормально. На рисунке ниже показаны результаты 5 строк, вводимых пользователем:

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

Как вы можете видеть на изображении, строка "A man, A plan, A canal-Panama" дает противоположный результат, в то время как остальные строки при условии, что ожидаемый результат. Где в моем коде это вызывает это? Совет и/или конструктивная критика были бы действительно полезны.

+1

Что вы сделали, чтобы попробовать и отладить это? Например. отладчик шаг за шагом, выходные промежуточные результаты и т. д.?? –

ответ

0

Для примера кода, основная проблема заключается в вашем втором методе цикла в методе преобразования. Вот фиксированная версия.

// 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.