getline C ++的奇怪行为

时间:2012-01-24 09:07:06

标签: c++

我正在编写一个简单的程序,其中所有'空格'将被'%20'替换。

#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];&amp;在通过delete[]提取输入的同时删除getline也会删除错误。

  4. 我正在使用i686-apple-darwin10-g ++ - 4.2.1:

    非常感谢任何帮助。

3 个答案:

答案 0 :(得分:6)

最后一行必须是 * cstr ='\ 0'; 不是 ==

答案 1 :(得分:2)

将代码末尾的*cstr == '\0';更改为*cstr = '\0';
中提琴!

答案 2 :(得分:2)

 *cstr == '\0';

此行检查*cstr是否等于'\0',并相应地返回10

这是错误的,因为你想在字符串的末尾插入\0字符 所以写单=而不是双=