c++字符串交换.为什么它会起作用?

C++ string swap. Why does it work?

本文关键字:起作用 为什么 字符串 交换 c++      更新时间:2023-10-16

基本上,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注入所有标识符到全局命名空间。您的程序实际上并没有使用这个头文件中的任何内容,因此您可以删除它。