-2

这是我的一段代码

    std::string s;  
    getline(cin, s);

    std::cin.clear();
    s.erase(std::remove_if(s.begin(), s.end(), my_predicate), s.end());
    char *str1  = (char*)malloc(sizeof(char)*(s.size()+1));
    const int length = s.length();
    for(int i=0; i < length; ++i)
    {
        s[i] = std::tolower(s[i]);
    }
    strncpy(str1,s.c_str(), s.length()+1);

    printf("\n");

问题是如果我不打印 \n 代码就会崩溃。我也尝试过 memcpy 和 strdup 但无济于事。有什么错误或任何方法可以摆脱这个吗????

4

2 回答 2

0

如果您绝对需要 的可写副本std::string s,请查看相关问题的答案;代替

char *str1  = (char*)malloc(sizeof(char)*(s.size()+1));
strncpy(str1,s.c_str(), s.length()+1);

基本上,这样做:

boost::scoped_array<char> writable(new char[s.size() + 1]);
std::copy(s.begin(), s.end(), writable.get());
writable[s.size()] = '\0'; 

// access char * via writable.get()!

这带来了额外的好处,那就是不必担心事后是否释放任何内存!

于 2012-09-21T09:08:20.813 回答
0

虽然我认为您的代码并不完美,但我看不出它为什么会崩溃。既然你说, printf("\n") 可以防止崩溃,我想堆已经损坏了。也许显示来自 myPredicate 的代码或单独测试给定的代码片段以找出原因。

于 2012-09-21T09:04:17.383 回答