C ++没有按照我自己的字符串复制功能打印

时间:2014-03-11 16:47:32

标签: c++ string strcpy

对不起另一个字符串复制问题..但我真的找不到我的代码中的原因,strTo可以打印,但strFinal不能以任何方式。

cout << strTo << endl;

cout << strFinal << endl;
while (*strFinal != '\0') {
    cout << *strFinal++;
}

赞赏是否有人可以指出我误解了指针和数组的地方!谢谢!

#include <iostream>

using namespace std;

char *str_copy (const char *strFrom, char *strTo) 
{
    while (*strFrom != '\0') {
        *strTo++ = *strFrom++;
    }
    *strTo = '\0';
    return strTo;
}

int main()
{
    char strFrom[]="abc123";
    char strTo[10];
    char *strFinal = str_copy(strFrom, strTo);

    cout << strTo << endl;

    cout << strFinal << endl;
    while (*strFinal != '\0') {
        cout << *strFinal++;
    }

    return 0;
}

附加问题:

我不知道将代码放在main函数中的原因如下:

char strFrom[]="abc123";
char strTo[10];
strTo = str_copy(strFrom, strTo);

然后编者说:

  

main.cpp:18:错误:数组类型'char [10]'不可分配       strTo = str_copy(strFrom,strTo);       ~~~~~ ^

我应该如何纠正这种方式?谢谢!

4 个答案:

答案 0 :(得分:4)

该函数返回指向终止零的指针。

char *str_copy (const char *strFrom, char *strTo) 
{
    //...
    *strTo = '\0';
    return strTo;
}

按以下方式更改

char *str_copy (const char *strFrom, char *strTo) 
{
    char *p = strTo;
    while ( *p++ = *strFrom++ );

    return strTo;
}

此外,我将声明它与声明标准C函数strcpy的方式相同

char *str_copy( char *strTo, const char *strFrom );

至于你的附加问题,那么你可能不会将指针或甚至其他数组分配给数组。所以编译器会发出错误。

数组没有赋值运算符。您只能复制其元素。 否则使用标准类std::array

答案 1 :(得分:1)

str_copy返回后,strTo不会指向复制字符串的开头。在main strTo中可以,因为它是按值传递的(即使您使用str_copystrTo++返回后指针的地址也不会更改。但是strFinal的返回值指向复制字符串的最后一个字符 - '\0'

对于第二部分 - char [10]具有不可更改的地址,因此您无法为此类型的变量分配任何内容,就像您在strTo = str_copy(...);中尝试过的那样。

答案 2 :(得分:0)

你的第二个问题:你正试图用char *来表示char [10],这是不可能的

&strTo[0] = str_copy(strFrom, strTo);

但由于副本是在

内完成的,所以它没用

答案 3 :(得分:0)

在你的代码中,在调用str_copy()函数之后:

char *strFinal = str_copy(strFrom, strTo);

strFinal指向'\ 0',它位于“abc123”的末尾。

main()函数中的

strTo可以正确显示,因为它不是同一个strTo  在str_copy()函数中,但指向strTo [10]。 str_copy()中的strTo仍然指向终止零。