我试图重写strcpy函数,但我陷入其中,当第一个arg是字符的静态数组时,我的函数不运行,仅当它是分配的指针时才运行。我认为问题是我的函数中的realloc语句。请帮我解决我的问题...
#include <stdio.h>
#include <stdlib.h>
int myStrlen(const char *);
char *myStrcpy(char *, const char *);
int main() {
char str1[40];
char str2[] = "one piece";
char *str;
str = (char*)malloc(1 * sizeof(char));
myStrcpy(str, str2);
printf("%s", str);
myStrcpy(str1, str2);
printf("%s", str1);
return 0;
}
int myStrlen(const char *str) {
int i = 0, len = 0;
while (str[i++] != '\0') {
len++;
}
return len;
}
char *myStrcpy(char *str1, const char *str2) {
int len1, len2;
len1 = myStrlen(str1);
len2 = myStrlen(str2);
str1 = (char*)realloc(str1, len2 * sizeof(char));
for (int i = 0; i < len2; i++) {
str1[i] = str2[i];
}
str1[len2] = '\0';
return str1;
}
请帮助我使我的代码使用指针工作...
顺便说一句,这是我的不使用指针的函数,有什么想法吗?
void myStrcpy(char str1[], char str2[]) {
int i = 0;
while (str2[i] != '\0') {
str1[i] = str2[i];
i++;
}
str1[i] = '\0';
}
void myStrncpy(char str1[], char str2[], int n) {
int i = 0;
while (str2[i] != '\0' || i <= n) {
str1[i] = str2[i];
i++;
}
str1[i] = '\0';
}
最佳答案
您的第一个实现出于无效目的使用realloc()
。对于标准函数strcpy()
,假定str1
指向具有足够空间来存储str2
副本的数组。
如果您打算实现与strcpy
不同的语义,请使名称更明确,然后将其传递给目标指针的地址,因为realloc()
可能返回不同的指针。在您的示例中,str
的原始值在调用myStrcpy()
之后使用,这是不正确的。
您的第二种实现几乎是正确的:
您应将size_t
用作i
的类型。在当前系统上,字符串可以长于INT_MAX
。
您应该将源字符串设置为const
。myStrncpy
应该在i
到达n
时停止,使用&& i < n
在取消引用i < n
指针之前测试str2
允许将无效指针与n
的零值一起传递,这很有用。myStrcpy
和myStrncpy
应该返回目标指针。
请注意,myStrncpy
的语义比strncpy
好得多。标准函数strncpy
不能满足大多数程序员的期望。它的语义容易出错,不应使用它来避免潜在的混乱。
这是一个简化的版本:
#include <stdlib.h>
size_t myStrlen(const char *str) {
size_t len = 0;
while (str[len] != '\0') {
len++;
}
return len;
}
char *myStrcpy(char *str1, const char *str2) {
size_t i = 0;
while (str2[i] != '\0') {
str1[i] = str2[i];
i++;
}
str1[i] = '\0';
return str1;
}
char *myStrncpy(char *str1, const char *str2, size_t n) {
size_t i = 0;
while (i < n && str2[i] != '\0') {
str1[i] = str2[i];
i++;
}
str1[i] = '\0';
return str1;
}