Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/153.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用c+中的指针复制字符串+;,在复制过程中,程序正在崩溃_C++_Visual C++ - Fatal编程技术网

C++ 使用c+中的指针复制字符串+;,在复制过程中,程序正在崩溃

C++ 使用c+中的指针复制字符串+;,在复制过程中,程序正在崩溃,c++,visual-c++,C++,Visual C++,使用指针将一个字符串复制到另一个字符串时出错 #include<iostream> #include<string> using namespace std; void String_copy(char* scr,char* des) { while(*scr!='\0') { *des= *scr; scr++; des++; } } int main() { char *str1, *str2; str1=

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

#include<iostream>
#include<string>
using namespace std;
void String_copy(char* scr,char* des)
{
while(*scr!='\0')
    {

    *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;

        }
#包括
#包括
使用名称空间std;
无效字符串\u副本(字符*scr,字符*des)
{
而(*scr!='\0')
{
*des=*scr;
scr++;
des++;
}
}
int main()
{
字符*str1,*str2;
str1=“巴拉斯”;
str2=“ygftygyfrgtg”;
字符串拷贝(str1、str2);

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

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

char *str1, *str2;
str1="bharath";
str2="ygftygyfrgtg";
您应该只将字符串文本分配给
const*char
,这也意味着您不应该修改str和str2

您可以使用以下方法修复上述问题:

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

但您还必须修复代码> String拷贝> /COD> -以便检查修改的数组的边界,即,添加最大长度的代码< DES>代码>,也不要忘记在结尾添加“0”。

< P> >首先,ISO C++ +强>禁止< /强>将字符串常量转换为<代码> char *< /Cord>指针。 请尝试这样定义
str1
str2

char str1[]="bharath";
char str2[]="ygftygyfrgtg";
第二个问题是
String\u copy
函数,您只需检查其中一个字符串中的终端
\0
字符。此外,还应向
des
字符串中添加
\0
(如果它最初较长):

类似这样的方法会奏效:

void String_copy(char* scr,char* des){

    while(*scr!='\0' && *des!='\0')*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短的问题。这将导致相同的问题(写入您不拥有的内存).

还有许多其他严重错误。您可以将字符串文本的地址分配给指针,并且结果定义得很好——字符串文本是静态分配的,因此其地址在程序运行的整个过程中都保持有效。执行类似于
char*foo()的操作甚至是完全有效的(例如){return“some string”;}
即使“some string”看起来很模糊,它可能是函数的本地字符串,但实际上是静态分配的,因此在函数返回后它仍然有效。@JerryCoffin虽然您的示例可以工作,但这并不
char*str=“some string”;str[0]='X';
Correct——任何修改字符串文字内容的尝试都会导致未定义的行为。@JerryCoffin-hmm所以:
char-str[]=“some-string”;str[0]='X'
未定义,这将使此线程中的所有答案都无效?
gcc
char*str
放在与我的
char str[]
完全不同的内存位置,因此可能事实是,修改str[]这个版本运行得很好只是运气好,而且是特定于编译器的。我还想知道字符串文本是否保存在固定地址,以及您的示例:
char*foo(){return“some string”;} Works,由C++标准保证,或者实际上所有编译器都这样处理。定义一个字符数组的NOE,从字符串文字初始化数组,然后修改数组(不是文字本身)。这完全是可以接受的。当你试图修改字符串文字本身时,问题就出现了。