visual String使用c++中的指针进行复制,在复制过程中程序崩溃

visual String copy using pointers in c++, during the copy the program is crashing

本文关键字:复制 过程中 崩溃 程序 使用 String c++ 指针 visual      更新时间:2023-10-16

使用指针将一个字符串复制到另一个字符串时出错。

#include<iostream>
#include<string>
using namespace std;
void String_copy(char* scr,char* des)
{
while(*scr!='')
    {
    *des= *scr;
    scr++;
    des++;
    }
}
int main()
{
    char *str1, *str2;
    str1="bharath";
    str2="ygftygyfrgtg";
    String_copy(str1,str2);
    cout<<str1<<endl;
    cout<<str2<<endl;
    system("pause");
    return 0;
        }

在下面的代码中,您有未定义的行为:

char *str1, *str2;
str1="bharath";
str2="ygftygyfrgtg";

您应该只将字符串文字分配给const* char,这也意味着您不应该修改str和str2

你可以用修复上面的问题

char str1[] = "bharath";
char str2[] = "ygftygyfrgtg";

但您也必须修复String_copy,以便它检查被修改数组的边界,即添加最大长度为des的附加参数,也不要忘记在末尾添加"\0"。

首先,ISO C++禁止将字符串常量转换为char*指针。尝试这样的方法来定义str1str2:

char str1[]="bharath";
char str2[]="ygftygyfrgtg";

第二个问题是String_copy函数,您只需检查其中一个字符串中的终端字符。此外,您应该在des字符串中添加一个(以防它最初更长):

这样的东西会起作用:

void String_copy(char* scr,char* des){
    while(*scr!='' && *des!='')*des++=*scr++;
    *des=0;
}

请注意,您可以最大限度地复制,直到较短的字符串的长度,因为您没有在任何位置分配更多内存。

如果可能的话,还应该使用std::string

这两个字符串的长度不同,但您只检查其中一个字符串中的零终止符。要么使用长度相等的字符串,要么检查两者中的零终止符(并决定如何处理多余的字符)。

问题是"bharath"不是char*类型
它实际上是一种类型char const*,但该语言(为了与C兼容)允许在两者之间进行自动转换。如果你打开警告(并将其视为错误),这甚至不允许编译:

> g++ -std=c++11 -Wall -Wextra -Werror sc.cpp
sc.cpp:36:10: warning: ISO C++11 does not allow conversion from string literal to 'char *' [-Wwritable-strings]
    str1="bharath";

现在(您已经解决了这个问题),您遇到了目标字符串可能比src短的问题。这将导致同样的问题(写入你不拥有的内存)。