2014-11-17 2 views
0

공백 검사기를 만들어 공백이나 특수 문자를 무시합니다. 아래는 내 기능의 일부입니다. 그것이하는 일은 인자로 c 문자열을 취한 다음, orignal에서 공백과 특수 문자를 제거하기 위해 또 다른 c 문자열을 생성합니다. 두 번째 C 문자열을 출력 할 때 여전히 공백이나 특수 문자가 포함됩니다. 어떤 사람들은 왜 그렇게하고 있는지 설명 할 수 있습니까? 감사합니다C 문자열에서 공백과 특수 문자를 제거하므로

bool isPalindrome(char *line) 
{ 
    //variables 
    bool palindrome = true; 
    int length = strlen(line); 
    int count = 0; 


    //copy line to line2 with no spaces and no punctuation 
    char *line2 = new char[length + 1]; 
    int count2 = 0; 

    for(int i = 0; i < length; i++) 
    { 
     if(line[i] != ' ' && ispunct(line[i]) == false) 
     { 
     line2[count2] = line[i]; 
     count2 ++; 
     } 
    } 
    for(int i = 0; i < count2; i++) 
     cout << line[i]; 
    line2[length] = '\0'; 
+1

http://stackoverflow.com/questions/83439/remove-spaces-from -stdstring-in-c –

답변

1

당신은 널 종료 원래 길이에서 두 번째 문자열 :

line2[length] = '\0'; 

는 지금까지 원래 할당이 간다

line2[count2] = '\0'; 

을해야한다, 그것은 필요가 없습니다 문자열의 사본을 만들어 회문인지 확인하십시오. 특정 방향으로 공백이 아닌 비 구두점 문자를 찾는 함수가 필요합니다 :

int nextValidChar(const char *str, int &pos, const int step) { 
    pos += step; 
    while (pos >= 0 && str[pos] != '\0') { 
     char c = str[i]; 
     if (c != ' ' && !ispunct(c)) { 
      return c; 
     } 
     pos += step; 
    } 
    return -1; 
} 
제로와 length-1 두 개의 인덱스를 설정, 손에이 기능으로

, 양쪽 끝에서 모두 유효한 문자를 찾기 위해 반복적으로 nextValidChar를 호출합니다. 이

for(int i = 0; i < count2; i++) 
    cout << line[i]; 

이어야 때문에

+0

대단히 감사합니다! –

1

가 여전히 공백과 특수 문자로 출력되는 이유는

for(int i = 0; i < count2; i++) 
    cout << line2[i]; 
+0

늦게 답장을 보내 주셔서 감사합니다. 두 번째 눈빛에 감사드립니다. :) –

관련 문제