c++字符串交换.为什么它会起作用?
C++ string swap. Why does it work?
基本上,copy string函数应该将一个字符串复制到另一个字符串。两个字符串的输出都是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;
}
不工作。第二个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;
}
首先,您的代码根本无法编译,因为您的copyString
函数声明在语法上不正确。您设法在函数定义中使用了正确的语法,但是完全搞砸了声明。你发布的是真正的代码吗?
其次,传递给函数的是char *
指针。在函数参数列表中,char stringToCopyTo[]
相当于char *stringToCopyTo
。所以,你不是传递你的数组"按值",因为你似乎相信。c++中的数组是不可复制的。它们不能按值传递
第三,在函数内部,你只是将本地指针相互赋值。字符串不会被复制。没有东西会被复制。这意味着您的代码没有按预期"工作"。数组string2
保持未初始化。它包含垃圾,代码输出垃圾。(形式上,行为是未定义的。)
所以,在你的问题中,你所说的"工作"是什么意思,以及你在这里看到的"字符串交换"。
copyString
功能无效。在该函数内部,stringToCopy
等都是指针,您只需移动指针值而不改变所指向的字符。
在main
内部,不初始化string2
。所以做cout << string2
会导致未定义的行为。你看到的是显示未初始化变量的结果。
char string2[80] = "";
注意-你的函数原型是错误的;必须是char name[]
,而不是char[] name
。我猜这是一个打字错误(或某种编译器扩展)。
关于头文件:标准c++头文件包括<iostream>
和<cstring>
(和<string>
)。任何以.h
结尾的都是实现定义的。
一个常见的行为是c库头的名字,#include <string.h>
的行为像#include <cstring>
一样,从cstring
注入所有标识符到全局命名空间。您的程序实际上并没有使用这个头文件中的任何内容,因此您可以删除它。
- C++为什么尽管我调用了void函数,它却不起作用
- 为什么在保护模式下继承升级不起作用
- 为什么二进制搜索在我的测试中不起作用
- 为什么 const std::p air<K,V>& 在 std::map 上基于范围的 for 循环不起作用?
- 为什么简单的算术减法在"if"条件下不起作用?
- 为什么Stroustup书中的has_f不起作用
- 你能检查一下为什么在这个代码中从链接列表中删除项目不起作用吗
- 为什么这段代码不起作用,我该如何解决?
- 为什么 zlib 放气初始化调用一次不起作用?
- 为什么 ulimit -v 在 Clang 的地址清理器下不起作用?
- 为什么在 while 循环中返回表达式不起作用
- 为什么这些完全相似的代码不起作用?
- 为什么我的数组双精度函数不起作用?
- 以下打印树函数不起作用为什么?
- C++中的dynamic_cast在没有 RTTI 的情况下不起作用;为什么?
- 由于 RPTR->num=30 与 (*rptr).num=30 相同,但是*((*rptr).ptr).name 不起作用为什么?
- C++ 2D 数组起作用 - 为什么第二个索引不能是可变的
- 在调试器模式下工作,但在最终版本中不起作用.为什么
- 模组功能不起作用为什么
- CreateProcess在某些计算机上工作,而在其他计算机上不起作用.为什么