C: strcpy 函数中的一个错误,无法找到它
C: One error In strcpy function and cannot find it
我知道下面的这个 strcpy 函数不正确,但我似乎无法弄清楚我需要更改一两件事来修复它。任何帮助将不胜感激,因为我完全坚持这一点:
void strcpy(char *destString, char *sourceString)
{
char *marker, *t;
for(marker = sourceString, t = destString; *marker; marker++, t++)
*t = *marker;
}
strcpy() 是一个预定义函数,您正在尝试创建自己的 strcpy 函数。因此,当您编译程序时,您会遇到 冲突类型 错误。所以,首先重命名你的函数名。
嗯,这取决于你的环境..
例如,我看到一些我不喜欢的东西:
您没有检查输入参数是否为 != NULL
。这将导致*0
访问
我看到你没有用 '[=12=]'
字符(或 0
)终止你的字符串。所以,在循环之后(请注意。)添加 *t = 0;
这是一个非常简单的方法:
void copy(char * src, char * dst){
while(*src != '[=10=]'){
*dst = *src;
src++;
dst++;
}
*dst = '[=10=]';
}
int main(int argc, char** argv){
char src [] = "hello";
char dst [] = "----";
copy(src, dst);
printf("src: %s\n", src);
printf("dst: %s\n", dst );
}
有点像wildplasser的评论。首先,您遍历 src 指针。在 c 中,如果你有 '\0'(在一个格式正确的字符串中)那么你可以退出,因为它是最后一个字符。好的,您遍历 src 指针并将 src (*src) 的值分配给 dst (*dst) 的值,然后您只需增加两个指针...
全部
一个非常简单的 strcpy 函数是:
int strcpy(char *dest,char *source)
{
if (source==NULL)
{
printf("The source pointer is NULL");
return 0;
}
if (dest==NULL)
{
dest=(char*)malloc((strlen(source)+1)*sizeof(char));
}
int i;
for (i=0;source[i]!='[=10=]';i++)
{
dest[i]=source[i];
}
dest[i]='[=10=]';
return 1;
}
用这种方式复制字符串应该没有问题。始终使用索引而不是指针操作,这样更容易。
如果你使用 IDE,你应该学会使用调试功能来发现错误和问题,通常当你处理字符串时,最常见的运行时问题之一是缺少 '\ 0',它会自动让你的字符串函数进入它们不应该出现的内存区域。
如果您想实现自己的 strcpy()
,那么我建议您实现 strncpy()
。它最多会将 n-1
个字节从 source null-terminated character array
复制到 destination character array
并在 destination character array
.
的末尾添加 null character
void strcpy(char *dest, const char *src, size_t n)
{
if ((dest == NULL) || (src == NULL))
return;
int i;
for(i=0; i<(n-1) && src[i]; i++)
dest[i] = src[i];
dest[i]='[=10=]';
}
它不会让 buffer overflow
.
注意 - 我的实现不同于标准库 strncpy()
实现。标准库函数 strncpy() 最多复制 src 的 n 个字节。如果src的前n个字节中没有空字节,那么放在dest中的字符串就不会以空结尾。
I know that this strcpy function below is incorrect, but I cannot seem to figure out the one or two things I need to change to fix it.
你只需要在目标数组的末尾添加空字符。
void strcpy(char *destString, char *sourceString)
{
char *marker, *t;
for(marker = sourceString, t = destString; *marker; marker++, t++)
*t = *marker;
*t='[=11=]';
}
我知道下面的这个 strcpy 函数不正确,但我似乎无法弄清楚我需要更改一两件事来修复它。任何帮助将不胜感激,因为我完全坚持这一点:
void strcpy(char *destString, char *sourceString)
{
char *marker, *t;
for(marker = sourceString, t = destString; *marker; marker++, t++)
*t = *marker;
}
strcpy() 是一个预定义函数,您正在尝试创建自己的 strcpy 函数。因此,当您编译程序时,您会遇到 冲突类型 错误。所以,首先重命名你的函数名。
嗯,这取决于你的环境..
例如,我看到一些我不喜欢的东西:
您没有检查输入参数是否为
!= NULL
。这将导致*0
访问我看到你没有用
'[=12=]'
字符(或0
)终止你的字符串。所以,在循环之后(请注意。)添加*t = 0;
这是一个非常简单的方法:
void copy(char * src, char * dst){
while(*src != '[=10=]'){
*dst = *src;
src++;
dst++;
}
*dst = '[=10=]';
}
int main(int argc, char** argv){
char src [] = "hello";
char dst [] = "----";
copy(src, dst);
printf("src: %s\n", src);
printf("dst: %s\n", dst );
}
有点像wildplasser的评论。首先,您遍历 src 指针。在 c 中,如果你有 '\0'(在一个格式正确的字符串中)那么你可以退出,因为它是最后一个字符。好的,您遍历 src 指针并将 src (*src) 的值分配给 dst (*dst) 的值,然后您只需增加两个指针...
全部
一个非常简单的 strcpy 函数是:
int strcpy(char *dest,char *source)
{
if (source==NULL)
{
printf("The source pointer is NULL");
return 0;
}
if (dest==NULL)
{
dest=(char*)malloc((strlen(source)+1)*sizeof(char));
}
int i;
for (i=0;source[i]!='[=10=]';i++)
{
dest[i]=source[i];
}
dest[i]='[=10=]';
return 1;
}
用这种方式复制字符串应该没有问题。始终使用索引而不是指针操作,这样更容易。
如果你使用 IDE,你应该学会使用调试功能来发现错误和问题,通常当你处理字符串时,最常见的运行时问题之一是缺少 '\ 0',它会自动让你的字符串函数进入它们不应该出现的内存区域。
如果您想实现自己的 strcpy()
,那么我建议您实现 strncpy()
。它最多会将 n-1
个字节从 source null-terminated character array
复制到 destination character array
并在 destination character array
.
null character
void strcpy(char *dest, const char *src, size_t n)
{
if ((dest == NULL) || (src == NULL))
return;
int i;
for(i=0; i<(n-1) && src[i]; i++)
dest[i] = src[i];
dest[i]='[=10=]';
}
它不会让 buffer overflow
.
注意 - 我的实现不同于标准库 strncpy()
实现。标准库函数 strncpy() 最多复制 src 的 n 个字节。如果src的前n个字节中没有空字节,那么放在dest中的字符串就不会以空结尾。
I know that this strcpy function below is incorrect, but I cannot seem to figure out the one or two things I need to change to fix it.
你只需要在目标数组的末尾添加空字符。
void strcpy(char *destString, char *sourceString)
{
char *marker, *t;
for(marker = sourceString, t = destString; *marker; marker++, t++)
*t = *marker;
*t='[=11=]';
}