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

时间:2014-05-28 00:21:46

标签: c++ string

基本上,复制字符串函数应该将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;
}

3 个答案:

答案 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功能无效。在该函数内部stringToCopyare pointers,您只需移动指针值而不更改指向的字符。

main内,您不会初始化string2。因此,cout << string2会导致未定义的行为。您所看到的是显示未初始化变量的结果。

修复:

char string2[80] = "";

注意 - 您的函数原型是错误的;它必须是char name[],而不是char[] name。我想这是一个拼写错误(或某种编译器扩展)。


关于标头文件:标准C ++标头包括<iostream><cstring>(以及<string>)。以.h结尾的任何内容都是实现定义的。

常见的行为是C库头的名称,#include <string.h>的行为类似于#include <cstring>,同时将cstring中的所有标识符注入全局名称空间。您的程序实际上并没有使用此标题中的任何内容,因此您可以将其删除。