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,从字符串文字初始化数组,然后修改数组(不是文字本身)。这完全是可以接受的。当你试图修改字符串文字本身时,问题就出现了。