对不起另一个字符串复制问题..但我真的找不到我的代码中的原因,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); ~~~~~ ^
我应该如何纠正这种方式?谢谢!
答案 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_copy
,strTo++
返回后指针的地址也不会更改。但是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”的末尾。
strTo
可以正确显示,因为它不是同一个strTo
在str_copy()函数中,但指向strTo [10]。 str_copy()中的strTo
仍然指向终止零。