有人可以告诉为什么这段代码中的strcpy会返回一个空字符串吗?
#include <iostream>
char* strcpy(char* dest, const char* from) {
for ( ; *from; dest++, from++) {
*dest = *from;
}
return dest;
}
int main() {
char a[] = "aba";
char b[] = "hello";
std::cout << strcpy(a, b);
return 0;
}
我使用的编译器是GNU G ++ 11 4.9.2
upd:这也不起作用 #include
char* strcpy(char* dest, const char* from) {
for ( ; *from; dest++, from++) {
*dest = *from;
}
*dest = '\0';
return dest;
}
int main() {
char a[] = "abaaa";
char b[] = "hello";
std::cout << strcpy(a, b);
return 0;
}
答案 0 :(得分:2)
尝试使用临时指针:
char* strcpy(char* dest, const char* from) {
char *tmp = dest;
for ( ; *from; tmp++, from++) {
*tmp = *from;
}
*tmp = '\0';
return dest;
}
还可以考虑使用适当的字符数为dest分配内存。
答案 1 :(得分:0)
函数和程序本身无效。:)
例如,数组a
无法容纳数组b
中的所有字符,因为它的大小小于b
的大小。 (a
的大小等于4,而b
的大小等于6)
char a[] = "aba";
char b[] = "hello";
所以此声明中的strcpy(a, b)
调用
std::cout << strcpy(a, b);
导致未定义的行为。
对于该函数,它不会将终止零点从索引字符串复制到目标字符串。并且它不会返回指向目标字符串的第一个字符的指针,因为函数指针dest
内部已更改(已增加)
正确的功能可能看起来像
char* strcpy( char* dest, const char* from )
{
char *p = dest;
while ( *p++ = *from++ );
return dest;
}
答案 2 :(得分:0)
尝试这个:
,而不是递增dest和循环
char *StrCpy (char *dest, const char *from){
int i=0;
for (i=0;i<strlen(from);i++){
*(dest+i) = *(from+i);
}
*(dest+(strlen(from)))='\0';
return dest;
}