2012-01-24 106 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-G ++ - 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'与否并返回10相应

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