基本上,复制字符串函数应该将1个字符串复制到另一个字符串。这两个字符串的输出是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;
}
答案 0 :(得分:5)
它不起作用。第二行std::cout
行调用未定义行为,因为您在未初始化的数组上调用它。由于数组和字符串在内存中的布局方式似乎有效,std::cout
实际上可能会再次打印string1
,而string2
会填充不可打印的内容。
你是对的,copyString
函数在该函数之外没有做任何可观察的事情。它只是重新分配一些局部变量。但是,您只是将一个指针指向另一个指针,它会不复制该字符串。
对于标头,C标准库使用以.h
结尾的标头。 C ++标准库头文件没有。 iostream
位于C ++标准库中,string.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;
}
答案 1 :(得分:3)
首先,您的代码根本无法编译,因为您的copyString
函数声明在语法上是不正确的。您设法在函数定义中使用了正确的语法,但完全破坏了声明。你发布实际代码吗?
其次,你传递给函数的是char *
指针。在函数参数列表中,char stringToCopyTo[]
等同于char *stringToCopyTo
。所以,你似乎并没有按照价值&#34;传递你的数组。 C ++中的数组不可复制。它们不能通过价值传递。
第三,在函数内部,您只需为彼此分配本地指针。字符串不会被复制。什么都没有被复制。这意味着您的代码没有&#34;工作&#34;如预期。数组string2
仍然未初始化。它包含垃圾和代码输出垃圾。 (形式上,行为未定义。)
所以,不清楚你的意思是什么&#34;工作&#34;在你的问题中,你在哪里看到&#34;字符串交换&#34;这里。
答案 2 :(得分:2)
copyString
功能无效。在该函数内部stringToCopy
等are pointers,您只需移动指针值而不更改指向的字符。
在main
内,您不会初始化string2
。因此,cout << string2
会导致未定义的行为。您所看到的是显示未初始化变量的结果。
修复:
char string2[80] = "";
注意 - 您的函数原型是错误的;它必须是char name[]
,而不是char[] name
。我想这是一个拼写错误(或某种编译器扩展)。
关于标头文件:标准C ++标头包括<iostream>
和<cstring>
(以及<string>
)。以.h
结尾的任何内容都是实现定义的。
常见的行为是C库头的名称,#include <string.h>
的行为类似于#include <cstring>
,同时将cstring
中的所有标识符注入全局名称空间。您的程序实际上并没有使用此标题中的任何内容,因此您可以将其删除。