【问题标题】:String dimension error whel dealing with new operator处理新运算符时出现字符串尺寸错误
【发布时间】:2013-12-28 16:47:21
【问题描述】:

我正在尝试制作类似于 strlen(str,str) 函数(我有一个返回字符串)的东西来学习使用指针和 new 运算符,这是我的代码:

char* strcat(char str1[], char str2[]){
int len=strlen(str1)+strlen(str2);
char* sfin = new char[len];
int i=0;

for (i=0;i<strlen(str1);i++)
    *(sfin+i)=*(str1+i);    //this could be *(sfin+i)= str1[i]

for (int j=0;j<strlen(str2);j++)
    *(sfin+j+i)=*(str2+j);  //this could be *(sfin+i+j)= str2[j]

return sfin;

}

它可以工作,除了 new 运算符分配了太多内存(或者它是对的吗?),从变量观察者中可以看出:

附:在 main() 函数中,我使用 gets(char*) 检索 str1 和 str2,并使用 puts(char*) 放置它们。 len 有正确的内容 (9)。

结果可能多种多样:有时它会放入正确的字符串,有时只放入两个“奇怪”字符,具体取决于参数。

【问题讨论】:

  • 如果你使用 C++,为什么不直接使用std::string 而不必担心内存管理?
  • 首先,您似乎没有输入空字符 ('\0') :-)
  • @AdamRosenfield 我不知道,这是作业,我的知识很少

标签: c++ c string


【解决方案1】:

在 c 和 c++ 中,字符串必须以 null 结尾。结果字符串包含 string1 和 string2 的值,但它不是以空值结尾的。结果字符串的长度应该等于 strlen(strin1)+strlen(string2)+1 并且可以为加 1 字符分配空终止符 '\0'

【讨论】:

    【解决方案2】:

    空终止的字符串必须是空终止的。您只能将所有字符复制到空终止符,而不是空终止符本身。也就是说,如果程序查看字符串的内容,它将继续查找,直到找到空终止符。确保添加空终止符并确保删除内存,例如,使用

    std::unique_ptr<char[]> strcat(char const* str1, char const* str2) {
        // ...
        std::unique_ptr<char[]> ptr(new char[len]);
        // ...
        return ptr;
    }
    

    顺便说一句,您在循环的每次迭代中使用 strlen() 可能会导致性能相当差,尤其是如果您的字符串很长。

    【讨论】:

    • 是的,我不得不改变循环。固定使用:'for (int j=0;j
    猜你喜欢
    • 2021-05-04
    • 2012-05-17
    • 2014-03-14
    • 2022-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-15
    • 1970-01-01
    相关资源
    最近更新 更多