2012-01-24 2 views
2

Я пишу простую программу, где все «пробелы» будут заменены на «% 20».Странное поведение с getline C++

#include <iostream> 
#include <string> 

using namespace std; 

int main (int argc, char* argv[]){ 

    string input; 
    cout << "please enter the string where spaces will be replaced by '%20'" << endl; 
    getline(cin, input); 
    //count the number of spaces 
    int countSpaces = 0; 
    for (int i = 0 ; i < input.length() ; i++){ 
     if (input[i] == ' '){ 
      countSpaces++; 

     } 

    } 

    int size = input.length() + (2 * countSpaces) + 1; 
    //char cstr1[size]; 
    char *cstr1 = new char[size]; 
    char *cstr = cstr1; 
    for (int i = 0 ; i < input.length() ; i++){ 
     if(input[i] == ' '){ 
      *cstr++ = '%'; 
      *cstr++ = '2'; 
      *cstr++ = '0'; 
     }    
     else{ 
      *cstr++ = input[i]; 

     } 

    } 
    *cstr == '\0'; 

    cout << cstr1 << endl; 
    delete[] cstr1; 

    return 0; 

} 

Я получаю странное поведение:

  1. С тестом ввода "this is strange " я получаю "this%20is%20strange%20%20his is", где я просто ожидать "this%20is%20strange%20%20"

  2. Если я жесткий код и та же строка, я получаю правильные результаты.

  3. Замена char *cstr1 = new char[size]; с char cstr1[size]; & удаления delete[] в то же время выборки вход через getline также устраняет ошибку.

Я использую i686-яблочный darwin10-г ++ - 4.2.1:

Любая помощь очень ценится.

+2

Вы попытались выполнить код в отладчике, чтобы увидеть, что происходит во втором цикле? –

ответ

6

Последняя строка должна быть * cstr = '\ 0'; не ==

+2

Хорошо поймите - обратите внимание также, что если OP скомпилировался с помощью 'g ++ -Wall ...', компилятор поймал бы ошибку для него. –

+1

Спасибо, он решил проблему. Похоже, я лишен сна: P – shiraz

+0

Это время, когда я хотел бы ударить моего компилятора тоже – Ulterior

2

Изменение *cstr == '\0'; в конце вашего кода *cstr = '\0';
Виола!

2
*cstr == '\0'; 

проверяет эту строку, если *cstr равен '\0' или нет и вернуть 1 или 0 соответственно

, что это неправильно, как вы хотите, чтобы вставить \0 символ в конце строки так написать единый = вместо double =

Смежные вопросы