【发布时间】:2013-10-04 05:22:51
【问题描述】:
#include<stdio.h>
char* my_strcpy(char*,const char*);
int main(){
char a[20];
char* s = "Hello world!";
char* d = a;
my_strcpy(d,s);
printf("\n d : %s \n",d);
return 0;
}
char* my_strcpy(char* dest,const char* sour){
if(NULL == dest || NULL == sour){
return NULL;
}
while(1){
*dest++ = *sour++;
if(*sour == '\0'){
*dest = *sour;
break;
}
}
}
为什么我们需要 char* 作为 my_strcpy 的返回类型。如果 d 是“”,它会给我一个分段错误。如果我将它分配给它,它工作正常。为什么给定“”时会出现段错误。
修改:在答案之后
#include<stdio.h>
char* my_strcpy(char*,const char*);
int main(){
char* ret;
char a[20];
char* s = "Hello world!";
char* d = "";
ret = my_strcpy(d,s);
if(NULL == ret){
perror("\nret");
}
// printf("\n d : %s \n",d);
return 0;
}
char* my_strcpy(char* dest,const char* sour){
char* temp;
if(NULL == dest || NULL == sour){
return NULL;
}
temp = dest;
while(1){
*temp++ = *sour++;
if(*sour == '\0'){
*temp = *sour;
break;
}
}
return temp;
}
这仍然会产生段错误。如果 s="" 传递给函数 strcpy 时如何处理条件。
【问题讨论】:
-
my_strcpy没有返回任何东西?也这样做:if(*(dest-1) == '\0') -
您已更改您的问题,请恢复到以前的版本。
if(*sour == '\0')曾是if(*dest == '\0') -
无法解释的变化让新读者感到困惑,无法将答案与当前问题联系起来
-
@Angus 没问题,但从下一次开始要小心,并在发布问题之前花点时间。我希望你能得到你的答案。
-
就目前情况而言 (2010-10-04 06:00:00Z — 修订版 7),使用
s = "";会导致问题,因为*dest++ = *sour++;行复制了空(零)字节并且是现在查看字符串末尾的数据(产生未定义的行为)。循环的规范形式(供您选择变量名)是while ((*dest++ = *sour++) != '\0') ;,分号是下一行的空循环体(但在 SO cmets 中不显示换行符)。这会完成赋值、增加指针并检查所分配的字符是否是零字节,所有这些都在一个操作中完成。
标签: c