我试图了解C中char *操纵的行为。 这是我的驱动程序代码:
char *str1 = malloc(30);
char *str2 = "hello programmers.";
char *str4 = "and have a nice day.";
char *str5 = my_strcat(str2, str4);
my_strcpy(str1, str2);
和我的strcpy实现:
void my_strcpy(char *dest, char *src){
while ((*dest++ = *src++)); //dest value is at end of char*
}
1。据我所知,当离开my_strcpy时, dest 应该指向字符串的结尾(因为我们一直在增加它的长度)。
现在让我们看看我的strcat:
char* my_strcat(char *first, char *second){
int l_first = strlen(first), l_second = strlen(second);
char *tmp = malloc (l_first + l_second + 1);
while ((*tmp++ = *first++));
tmp--; // overwrite tmp's "\0"
while ((*tmp++ = *second++)); // tmp value is end of char*
tmp-=(l_first+l_second + 1); // rewinding pointer to string start.
return tmp;
}
2。我必须手动“倒带” tmp,以便在功能外正确打印。
简而言之,我的问题是为什么会出现这种情况?我不确定如何描述我的问题,我希望它已经足够清楚了。为什么我必须在第二个函数中“倒带”指针,而不是在第一个函数中?此外,为什么我不必在第一个功能中“倒带” src 和 dest ?
我想到的可能的解释:
谢谢 (我试图提供尽可能多的信息,并且尝试的解决方案应该像一个很好的SO问题一样,对不起,如果回答太久了)
答案 0 :(得分:2)
为什么我必须在第二个函数中“倒带”我的指针,而不必 首先?而且,为什么我不必在其中“倒带” src和dest 第一个功能
这是因为在C
中,一切都是按值传递的。
传递值时,我们会将变量的副本传递给函数。
当我们通过引用传递时,我们会将变量的别名传递给函数。 它将指针的值(地址)复制到函数中。
因此,当您执行(*dest++ = *src++)
时,不会增加实际变量,因此str2
和str4
不会受到影响。
对于char* my_strcat(char *first, char *second)
,您将返回本地指针,该指针指向串联字符串中的最后一个字符,因此您需要后退。
如果您不希望倒转指针,则只需使用一个指向tmp
和return
伪指针开头的伪指针,如下所示。
char* my_strcat(char *first, char *second){
int l_first = strlen(first), l_second = strlen(second);
char *tmp = malloc (l_first + l_second + 1);
char *result = temp;
while ((*tmp++ = *first++));
tmp--; // overwrite tmp's "\0"
while ((*tmp++ = *second++)); // tmp value is end of char*
return result;
}
答案 1 :(得分:0)
如果要更改dest指针,则需要传递对其的引用:
char* my_strcat(const char **dest, const char *source){
size_t l_first = strlen(first), l_second = strlen(second);
char *tmp = malloc (l_first + l_second + 1);
char *result = temp;
const char *tmpdest = *dest;
if(tmp)
{
while ((*tmp++ = *tmpdest++));
tmp--; // overwrite tmp's "\0"
while ((*tmp++ = *second++)); // tmp value is end of char*
*dest = result;
}
return result;
}