在 C 中不使用 <string.h> 实现 strcpy() 函数
implementing a strcpy() function without using <string.h> in C
我的任务是这样的:我应该在以下约束下实现 strcpy 函数:
- 函数应该使用指针表达式(
*(d+i)
)
- 我应该在不使用的情况下实现它
<string.h>
我在 Visual Studio 2019 年编程。
我在google和运行中搜索了一些源代码,但是我的程序有一个逻辑错误。程序每次都会立即结束。我不知道我做错了什么。
这是我在 Visual Studio 2019 年 Windows 上的代码。请告诉我哪里出了问题。
#include <stdio.h>
void strcpy(char*, char*);
int main()
{
char* sen1 = "Hello";
char* sen2 = "Friends";
strcpy(sen1, sen2);
printf("The result: %s\n", sen1);
return 0;
}
void strcpy(char* str1, char* str2)
{
int i = 0;
while (*(str2 + i) != '[=11=]')
{
*(str1 + i) = *(str2 + i);
i++;
}
*(str1 + i) = '[=11=]';
}
两个问题,至少:
- 字符串文字在 C 中不可写。症状通常是崩溃 (SIGSEGV)。
- 您不能将标识符
strcpy
用于您自己的函数。使用其他名称。
三个干净的代码问题,至少:
- 将
int main()
变成 int main(void)
以使其正确输入。
str1
和 str2
是太通用的名称。它们不指示哪个是源指针,哪个是目标指针。 my_strcpy(char *dest, char *src)
呢?
- 我会使用
size_t i
作为索引计数器而不是 int
,因为这是所有字符串长度函数和 sizeof
运算符 return 的类型。它也是一个无符号类型,可以复制 真正 长字符串:-) size_t
在 #include <stddef.h>
. 之后可用
你想要这个:
...
char* source = "Hello";
// or char source[] = "Hello";
char destination[1000]; // destination buffer long enough for playing around
my_strcpy(destination, source);
printf("%s\n", destination); // should print "Hello" if my_strcpy is corect
...
其余部分请阅读 Jens 的回答。
除了需要为 sen1
提供可写存储外,您还应该在取消引用 str2
之前检查以确保函数中的 str2 != NULL
(否则,即使您修复了所有其他错误——可能会导致段错误)
例如,在您的代码中,您可以定义一个常量以用于设置 sen1
array 的大小(或者您可以使用 malloc()
、calloc()
或 realloc()
-- 留着以后用)。使用你可以做的数组,例如
#include <stdio.h>
#include <stdlib.h>
#define MAXC 64 /* if you need a constant, #define one (or more) */
...
int main (void)
{
char sen1[MAXC] = "Hello";
char *sen2 = "Friends";
mystrcpy (sen1, sen2);
printf ("The result: %s\n", sen1);
}
在你的 strcpy 函数中,在你的函数中使用 str2
之前检查 str2
不是 NULL
,例如
char *mystrcpy (char *dest, const char *src)
{
char *p = dest;
if (!src || !dest) { /* ensure src or dest is not NULL */
fputs ("error: src or dest parameters NULL in mystrcpy().\n", stderr);
exit (EXIT_FAILURE);
}
do /* loop */
*p++ = *src; /* copy each char in src to dest */
while (*src++); /* (including the nul-termianting char) */
return dest; /* return pointer to dest */
}
现在您将在您的(重命名的)mystrcpy()
函数中将您的源字符串复制到您的目标字符串,接收您期望的结果:
例子Use/Output
$ ./bin/mystrcpy
The result: Friends
检查一下,如果您还有其他问题,请告诉我。
在其他好的答案中,只是关于 strcpy
函数的实现,而不是对实际代码的详细问题分析,另一种方法是:
char * n_strcpy(char * dest, char const * src)
{
if (dest == NULL || src == NULL)
{
return NULL;
}
char *ptr = dest;
while ((*dest++ = *src++));
return ptr;
}
我的任务是这样的:我应该在以下约束下实现 strcpy 函数:
- 函数应该使用指针表达式(
*(d+i)
) - 我应该在不使用的情况下实现它
<string.h>
我在 Visual Studio 2019 年编程。 我在google和运行中搜索了一些源代码,但是我的程序有一个逻辑错误。程序每次都会立即结束。我不知道我做错了什么。 这是我在 Visual Studio 2019 年 Windows 上的代码。请告诉我哪里出了问题。
#include <stdio.h>
void strcpy(char*, char*);
int main()
{
char* sen1 = "Hello";
char* sen2 = "Friends";
strcpy(sen1, sen2);
printf("The result: %s\n", sen1);
return 0;
}
void strcpy(char* str1, char* str2)
{
int i = 0;
while (*(str2 + i) != '[=11=]')
{
*(str1 + i) = *(str2 + i);
i++;
}
*(str1 + i) = '[=11=]';
}
两个问题,至少:
- 字符串文字在 C 中不可写。症状通常是崩溃 (SIGSEGV)。
- 您不能将标识符
strcpy
用于您自己的函数。使用其他名称。
三个干净的代码问题,至少:
- 将
int main()
变成int main(void)
以使其正确输入。 str1
和str2
是太通用的名称。它们不指示哪个是源指针,哪个是目标指针。my_strcpy(char *dest, char *src)
呢?- 我会使用
size_t i
作为索引计数器而不是int
,因为这是所有字符串长度函数和sizeof
运算符 return 的类型。它也是一个无符号类型,可以复制 真正 长字符串:-)size_t
在#include <stddef.h>
. 之后可用
你想要这个:
...
char* source = "Hello";
// or char source[] = "Hello";
char destination[1000]; // destination buffer long enough for playing around
my_strcpy(destination, source);
printf("%s\n", destination); // should print "Hello" if my_strcpy is corect
...
其余部分请阅读 Jens 的回答。
除了需要为 sen1
提供可写存储外,您还应该在取消引用 str2
之前检查以确保函数中的 str2 != NULL
(否则,即使您修复了所有其他错误——可能会导致段错误)
例如,在您的代码中,您可以定义一个常量以用于设置 sen1
array 的大小(或者您可以使用 malloc()
、calloc()
或 realloc()
-- 留着以后用)。使用你可以做的数组,例如
#include <stdio.h>
#include <stdlib.h>
#define MAXC 64 /* if you need a constant, #define one (or more) */
...
int main (void)
{
char sen1[MAXC] = "Hello";
char *sen2 = "Friends";
mystrcpy (sen1, sen2);
printf ("The result: %s\n", sen1);
}
在你的 strcpy 函数中,在你的函数中使用 str2
之前检查 str2
不是 NULL
,例如
char *mystrcpy (char *dest, const char *src)
{
char *p = dest;
if (!src || !dest) { /* ensure src or dest is not NULL */
fputs ("error: src or dest parameters NULL in mystrcpy().\n", stderr);
exit (EXIT_FAILURE);
}
do /* loop */
*p++ = *src; /* copy each char in src to dest */
while (*src++); /* (including the nul-termianting char) */
return dest; /* return pointer to dest */
}
现在您将在您的(重命名的)mystrcpy()
函数中将您的源字符串复制到您的目标字符串,接收您期望的结果:
例子Use/Output
$ ./bin/mystrcpy
The result: Friends
检查一下,如果您还有其他问题,请告诉我。
在其他好的答案中,只是关于 strcpy
函数的实现,而不是对实际代码的详细问题分析,另一种方法是:
char * n_strcpy(char * dest, char const * src)
{
if (dest == NULL || src == NULL)
{
return NULL;
}
char *ptr = dest;
while ((*dest++ = *src++));
return ptr;
}