C++ C++;字符串交换。它为什么有效?

C++ C++;字符串交换。它为什么有效?,c++,string,C++,String,基本上,复制字符串函数应该将一个字符串复制到另一个字符串。两个字符串的输出都是Hello World!但是,为什么这实际上是可行的,因为我只传递这些字符串的值?我不是通过引用或其他方式传递 我的第二个问题是为什么我必须包括string.h而不是iostream.h?为什么.h部分只需要包含字符串头文件就可以了?为什么iostream如此特殊,它不需要.h扩展名 #include <iostream> #include <string.h> void copyString

基本上,复制字符串函数应该将一个字符串复制到另一个字符串。两个字符串的输出都是Hello World!但是,为什么这实际上是可行的,因为我只传递这些字符串的值?我不是通过引用或其他方式传递

我的第二个问题是为什么我必须包括string.h而不是iostream.h?为什么.h部分只需要包含字符串头文件就可以了?为什么iostream如此特殊,它不需要.h扩展名

#include <iostream>
#include <string.h>

void copyString(char[] stringToCopyTo, char[] stringToCopy);

int main(){

    char string1[] = "Hello World!";
    char string2[80];

    copyString(string2, string1);

    std::cout << "String1: " << string1 << "\n";
    std::cout << "String2: " << string2 << "\n";

    return 0;
}

void copyString(char stringToCopyTo[], char stringToCopy[]){
    stringToCopyTo = stringToCopy;
}
#包括
#包括
无效复制字符串(char[]stringToCopyTo,char[]stringToCopy);
int main(){
char string1[]=“你好,世界!”;
charstring2[80];
复制字符串(字符串2、字符串1);

std::cout不起作用。第二行
std::cout
调用未定义的行为,因为您在未初始化的数组上调用它。它似乎起作用,因为数组和字符串在内存中的布局方式,
std::cout
可能实际上再次打印出
string1
,并且
string2
中填充了不可打印的内容

您是正确的,
copyString
函数在该函数之外不做任何可观察的事情。它只是重新分配一些局部变量。然而,您只是将一个指针分配给另一个指针,它不会复制字符串

<> >标题,C标准库使用标题为“<代码> > h < /C++ > C++标准库头不.C++代码> <代码>在C++标准库中,代码>字符串。h <代码>在C标准库中。但是,在C++中使用C头时,使用C++等价物,通常是由代码< C >代码>预先定义的头名。本例为
cstring
。注意,无
.h

但是,既然你使用C++,你应该使用C++字符串,那么你的函数会按照你的要求做:

#include <iostream>
#include <string> // C++ string header

// Strings passed by reference
void copyString(std::string& stringToCopyTo, std::string& stringToCopy);

int main(){

    std::string string1 = "Hello World!";
    std::string string2;

    copyString(string2, string1);

    std::cout << "String1: " << string1 << "\n";
    std::cout << "String2: " << string2 << "\n";

    return 0;
}

// Strings passed by reference
void copyString(std::string& stringToCopyTo, std::string& stringToCopy){
    stringToCopyTo = stringToCopy;
}
#包括
包含//C++字符串头
//通过引用传递的字符串
无效复制字符串(std::string和stringToCopyTo,std::string和stringToCopy);
int main(){
std::string string1=“你好,世界!”;
std::string2;
复制字符串(字符串2、字符串1);

std::cout函数
copyString
无效。在该函数中,
stringToCopy
等,您只需在指针值周围移动,而不更改指向的字符


main
中,您没有初始化
string2
。因此,首先,您的代码根本无法编译,因为您的
copyString
函数声明在语法上是不正确的。您在函数定义中使用了正确的语法,但完全搞糟了声明。您发布的是真正的代码吗?

第二,你在函数中传递的是代码> char */COD>指针。在函数参数列表<代码>中,char StuttoPopyto []/Cord>相当于 char *StuttoPopyto 。因此,你并没有像你所相信的那样通过“值”数组。C++中的数组是不可复制的。它们不能按值传递。

第三,在函数内部,您只是将本地指针分配给彼此。字符串不会被复制。没有任何东西会被真正复制。这意味着您的代码没有按预期“工作”。Array
string2
保持未初始化状态。它包含垃圾,代码输出垃圾。(从形式上讲,行为是未定义的。)


因此,不清楚您在问题中所说的“有效”是什么意思,以及您在哪里看到“字符串交换”这里。

您的代码有未定义的行为,因为
string2
不是以null结尾的,事实上是未初始化的。由于未定义行为的魔力,它可以工作,对于解决任何问题都非常有用,因为一个可能的结果是,您的程序实际上按预期工作!啊,忽略那些括号lol。我复制了它slig在我重新编辑代码之前。@Dominic Oryema:不,我们不会“忽略那些括号”。你必须重新发布准确的真实代码。也要发布准确的输出。这段代码“工作”只是偶然的,但很难相信这段代码能产生“正确”的输出,即使是偶然的。
char[]str
看起来像Java。请注意,C数组的行为与Java数组不太相似。我假设他的意思是,输出结果与字符串复制成功时的结果相同。@Mooing Duck:我高度怀疑这在实践中是可能的(当然,理论上是可能的)。OP发布的代码很可能与OP实际运行的代码不同。(特别是在考虑到发布的代码不可编译的情况下。)
char string2[80] = "";