【问题标题】:C++ error of buffer after strcpystrcpy 后缓冲区的 C++ 错误
【发布时间】:2012-09-21 08:47:24
【问题描述】:

这是我的一段代码

    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 但无济于事。 有什么错误或任何方法可以摆脱这个吗????

【问题讨论】:

  • char *str1 = = (char*)malloc(sizeof(char)*(s.size()+1)); 甚至可以用 double = 编译吗?
  • 如果你真的使用 C++,正如你的标签所示,那么在所有情况下都切换到 std::string 而不是使用char *!这通常会纠正由于无效的指针算术或错误的索引导致的所有无效访问......你真正想要实现什么?顺便说一句,变量t1 完全未使用,s 似乎已经包含正确的最终结果(小写字符串)!所以不需要str1t1!!!
  • @mathematician1975 - 这是一个编辑问题,抱歉......
  • @RandolphCarter - 这些变量将在代码中进一步使用...
  • 但为什么要使用char *?如果您必须在需要的地方使用 API 函数,请在最后一刻通过 c_str() 转换为 char *

标签: c++ string strcpy


【解决方案1】:

如果您绝对需要std::string s 的可写副本,请查看this answer to a related question;而不是

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()!

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

【讨论】:

  • 您可以使用std::vector&lt;char&gt; writable( s.begin(), s.end() );,然后通过&amp;writable[0] 访问char*
【解决方案2】:

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

【讨论】:

  • bool my_predicate(char c) { return !(isalpha(c) || c==' '); }
猜你喜欢
  • 2015-07-07
  • 2021-10-12
  • 2010-12-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多