2011-11-24 2 views
3
#include <iostream> 
#include <ctype.h> 

using namespace std; 

void isPalindrome(); 

int main() 
{ 
    char response; 
    isPalindrome(); 
    cout << "Input another string(y/n)?" << endl; 
    cin >> response; 
    response = toupper(response); 
    if (response == 'Y') 
     isPalindrome(); 

    return 0; 
} 

void isPalindrome() 
{ 
    char str[80], str2[80]; 
    int strlength; 
    int j = 0; 
    int front, back; 
    bool flag = 1; 

    cout << "Input a string:" << endl; 
    cin.getline(str, 80); 
    strlength = strlen(str); 

    for (int i = 0; i < strlength; i++) 
    { 
     if (islower(str[i])) 
      str[i] = toupper(str[i]); 
    } 

    for (int i = 0; i < strlength; i++) 
    { 
     if (isalpha(str[i])) 
     { 
      str2[j] = str[i]; 
      j++; 

     } 
    } 

    str2[j] = '\0'; 
    front = 0; 
    back = strlength - 1; 

    for (int i = 0; i < j/2; i++) 
    { 
     if (str2[front] != str2[back]) 
     { 
      flag = 0; 

      break; 
     } 
    } 

    if (!(flag)) 
     cout << "It is not a palindrome" << endl; 
    else 
     cout << "It's a palindrome" << endl; 

    cout << "str: " << str << " str2: " << str2 << " strlength: " << strlength << " j: " << j << endl; 
    cout << "front: " << front << " back: " << back << " flag: " << flag << endl; 
} 

아무도 내 코드가 작동하지 않는 이유를 설명하는 데 도움이 될지 궁금합니다.palindrome 프로그램에서 둘 이상의 문자열을 입력 할 수 없습니다.

한 번 제대로 실행할 수 있지만 올바른 대답을 얻을 수 있지만 다른 문자열을 입력 할 것인지 묻는 메시지가 나타나면 'y'을 입력하면 프롬프트가 입력을 건너 뛰고 자신이 종료됩니다.

나는 cin.ginore('\n', 80)을 시도했지만, 그저 공백의 줄을 많이 줬다. 마지막에 코드 값을 추가하여 값을 확인하고 모두 0으로 이동하여 문자열을 삭제합니다.

시스템에서 메모리를 처리하는 방법에 대한 적절한 설명 링크가 있습니까?

편집 : 두 번째 입력 시퀀스를 실행할 때도 동일한 문제가 계속 발생합니다. 출력은 다음과 같습니다 :

나는 처음부터 프로그램을 다시 빌드하고 기능없이 수행하려고합니다. 나는 여전히 현대 C++를 사용하여 사용자 입력을 처리하는 방법을 설명하는 페이지에 대한 링크를 고맙게 생각합니다.

+2

을 내가 반드시 그 통해 읽을 수 없다 * 엉망 내가 메인으로의 do-while 루프를 추천 할 것입니다 * 아무 것도 설명 할 필요는 없지만 최신 C++를 사용하여 사용자 입력을 처리하는 방법에 관심이 있다면 알려 주시면 게시 할 수 있습니다. –

+0

@KerrekSB 또는 당신은 바퀴를 재발견 할 필요가 없도록 링크를 게시 할 수 있습니까? :) –

+0

나는 그것을 분명히 감사 할 것이다. 내가해야 할 일이라면 밤새도록이 일을 할 것이므로 어떤 도움이라도 대단히 감사 할 것입니다. –

답변

1

문제이다.

사용자 응답을 읽은 후 입력 버퍼에서 줄 바꿈을 제거해야합니다. 다음을 사용하여 수행하십시오.

cin >> response; 
std::cin.ignore(INT_MAX); 

위의 수정 프로그램을 사용하면 palindrome 검사를 한 번만 다시 시도 할 수 있습니다. 가능한 많은 재 시도를 가능하게하려면 루프가 필요합니다. 하나는 일반적으로 문자열 처리를위한 표준 라이브러리 구성 요소를 사용하는 것이

char response; 
do { 
     isPalindrome(); 
     cout << "Input another string(y/n)?" << endl; 
     cin >> response; 
     std::cin.ignore(INT_MAX); 
     response = toupper(response); 
} while(response == 'Y'); 
0

루프가 필요합니다. 프로그램이 맨 위로 돌아가도록 지시하는 코드는 없습니다.

char response = 'Y'; 
while (response == 'Y') { 
    isPalendrome(); 
    cout << "Input another string(y/n)?" << endl; 
    cin >> response; 
} 

이 전체 프로그램, 당신은 while 루프에 필요한 단지 핵심 요소는 아니다. 작업하는 동안의 작동 방식을 이해하고 프로그램에서이 작업을 수행해야합니다.

cin >> response; 

이것은 가변 response으로 사용자 입력 y/n를 판독하지만 개행이 getline 함수 isPalindrome 함수에 의해 촬상 된 입력 버퍼에 남아있는 것 :

+0

http://en.wikipedia.org/wiki/While_loop – Godwin

+0

서식 도움에 대해 muntoo에게 감사드립니다. :) –

+0

방금 ​​코드를 실행했습니다. isPalendrome이 두 번 이상 작동하지 못하게하는 또 다른 문제가 있습니다. – Godwin

0

++ 현대 C에서 :

#include <iostream> 
#include <string> 

int main() 
{ 
    std::string line1, line2, response; 

    do 
    { 
     std::cout << "First string: "; 
     if (!std::getline(std::cin, line1)) { /* error */ } 

     std::cout << "Second string: "; 
     if (!std::getline(std::cin, line2)) { /* error */ } 

     // check line1 and line2 for palindromy 

     std::cout << "Again (y/n)? "; 
     std::getline(std::cin, response); 

    } while (std::cin && (response == "y" || response == "Y")); 
} 
+0

아, 그렇습니다.하지만 숙제 C++은 현대 C++가 아니기 때문에 많은 경우 C++이라고 할 수 없습니다. C가 아닌 비표준 컴파일러로 컴파일되어 학교에서 작은 (엄청난) 수수료를 받고 언젠가는 1998 년 이전에. –

+0

@r_ahlskog : "숙제 C++"가 끔찍한, 끔찍한 가르침의 결과인지, 아니면 학습자의 일부분에 대한 막대한 혼란의 결과인지는 확실하지 않습니다. 나는 우리가 단지에 게시하는 사람들을 볼 수 있기 때문에 선택 편견이 있다고 상상하지만, 그것은 상당히 불안정합니다. –

+0

글쎄 내 학교에서 적어도 이것은 "당신이 그것을 현실에서 어떻게 할 것인가가 아니지만 우리는 그것을 할 것입니다 C# 프로그램에서 최소 온도 평균을 제시하고 데이터베이스에서 샘플 온도 로그를 읽는 주제에 접근 할 때 4 년째 CS 전공자가 마음에 들었습니다. 그러나 그렇습니다 편견이다는 것을 나는 짐작하고, 나가 매일에 여기에서 배치 해 몇몇 사람들과 일해야하지 않을 것이라는 점을 희망한다. –

관련 문제