连接两个字符指针
Concate two char pointers
我刚学C,到了指针的地步。我写了一个应该连接两个 char 指针的方法,我得到了一个奇怪的行为,我无法向自己解释,也没有找到答案,所以也许你可以帮忙!
所以我不明白为什么 stringcat
和 stringptr
指向不同的地址,即 8 字节的地址。其次,我不明白为什么我不能在底部的两个 while 循环中使用 stringcat
。我只是没有得到任何输出。另外,如果我在最后一个 printf
中使用 stringptr[0]
,则不会有任何输出。
提前感谢您的帮助!
编辑:此代码有效,我只是不明白为什么我不能在底部使用 stringcat
。
Edit2:注意到一些 * 在复制粘贴时丢失了,所以我添加了它们!
char stringcat(const char str1, const char* str2){
char *ptr1 = str1;
char *ptr2 = str2;
int count = 0;
while(*ptr1 != '[=10=]'){
count++;
ptr1++;
}
while(*ptr2 != '[=10=]'){
count++;
ptr2++;
}
char *stringcat = malloc((count+1)*sizeof(char));
char *stringptr = stringcat;
printf("%d %d", &stringcat, &stringptr);
ptr1 = str1;
ptr2 = str2;
while(*ptr1 != '[=10=]' && (stringptr++ = ptr1++));
printf("%c", stringcat[0]);
while(*stringptr++ = *ptr2++);
return stringcat;
}
您犯了一些错误。有些会被编译器报告,但你必须打开警告。
如何调用 stringcat
以及 return 是什么?这是开发 function.One 方法的基本(第一个)问题是它得到两个字符串连接和 returns 一个新字符串,第二个连接到第一个。另一种方法是 return 第一个字符串与第二个字符串相连。
对于第一种方法,它必须分配可以容纳两个字符串的新存储空间,这样就是newstring= malloc(strlen(str1)+strlen(str2)+1);
不要忘记为字符串的终止空值添加 1。
对于第二种方法,本质上是一样的,只是str1
本身必须用malloc分配,因为你的函数会调用free
或realloc
重新分配(更长的)字符串所需的存储空间。
在这两种情况下,函数看起来都像 char *stringcat(char *str1, char *str2)
。我认为有了这个输入,您可以自己编写函数的其余部分。
您正在创建一个指向 char 的 char 指针。问题是,您没有将 char 变量分配给指针,而是分配给 char 的地址。
所以,你应该改变你的:
char *ptr1 = str1
收件人:
char *ptr1 =&str1
这是因为&var
获取的是变量的地址。
然后,您还使用了 *stringptr++
,它增加了它指向的字符的 值 ,而不是地址 space。
我强烈建议您阅读 K&R 书。对于新手和已经了解 C 的人来说,这都是一本很棒的书。事实上,其中解决的问题之一就是这个。
1)
printf("%d %d", &stringcat, &stringptr);
打印变量stringcat和stringptr的地址,它们是不同的,它们被分配到堆栈中,所以,推测,你正在编译一个x64位程序,所以它们相隔8个字节。
这个
printf("%d %d", stringcat, stringptr);
就是你想要的。
我只是对您的代码进行了最少的更改以使其正常工作:
char* stringcat(const char* str1, const char* str2) {
const char *ptr1 = str1;
const char *ptr2 = str2;
int count = 0;
while (*ptr1 != '[=12=]') {
count++;
ptr1++;
}
while (*ptr2 != '[=12=]') {
count++;
ptr2++;
}
char *stringcat = (char *)malloc((count + 1) * sizeof(char));
char *stringptr = stringcat;
printf("%d %d", stringcat, stringptr);
ptr1 = str1;
ptr2 = str2;
while (*ptr1 != '[=12=]' && (*stringptr++ = *ptr1++));
printf("%c", stringcat[0]);
while (*ptr2 != '[=12=]' && (*stringptr++ = *ptr2++));
*stringptr++ = '[=12=]';
return stringcat;
}
关于问题 1,stringcat
和 stringptr
确实指向地址。不同的是&stringcat
和&stringptr
。
通过声明 char *var = malloc(...)
,您将在堆栈中保留内存 space,假设地址 30
,用于指针变量 var
,然后让 var
包含 malloc-ed 的地址,比方说地址 200
(驻留在堆内存中)。
当您继续 char *var2 = var
时,您在堆栈中保留了另一批内容来存储新的指针变量 var2
,很可能是 31
。然后,您分配 var2
来保存包含在 var
中的地址,即 200
.
因此,地址 30
和 31
中的变量都将包含地址 200
。通过使用 &var
你得到的实际上是 30
而不是你期望的 200
。当然,&var2
与值 31
不同。
对于第二个问题,很难理解您要查找的内容,因为代码中存在其他答案所反映的错误。
我刚学C,到了指针的地步。我写了一个应该连接两个 char 指针的方法,我得到了一个奇怪的行为,我无法向自己解释,也没有找到答案,所以也许你可以帮忙!
所以我不明白为什么 stringcat
和 stringptr
指向不同的地址,即 8 字节的地址。其次,我不明白为什么我不能在底部的两个 while 循环中使用 stringcat
。我只是没有得到任何输出。另外,如果我在最后一个 printf
中使用 stringptr[0]
,则不会有任何输出。
提前感谢您的帮助!
编辑:此代码有效,我只是不明白为什么我不能在底部使用 stringcat
。
Edit2:注意到一些 * 在复制粘贴时丢失了,所以我添加了它们!
char stringcat(const char str1, const char* str2){
char *ptr1 = str1;
char *ptr2 = str2;
int count = 0;
while(*ptr1 != '[=10=]'){
count++;
ptr1++;
}
while(*ptr2 != '[=10=]'){
count++;
ptr2++;
}
char *stringcat = malloc((count+1)*sizeof(char));
char *stringptr = stringcat;
printf("%d %d", &stringcat, &stringptr);
ptr1 = str1;
ptr2 = str2;
while(*ptr1 != '[=10=]' && (stringptr++ = ptr1++));
printf("%c", stringcat[0]);
while(*stringptr++ = *ptr2++);
return stringcat;
}
您犯了一些错误。有些会被编译器报告,但你必须打开警告。
如何调用 stringcat
以及 return 是什么?这是开发 function.One 方法的基本(第一个)问题是它得到两个字符串连接和 returns 一个新字符串,第二个连接到第一个。另一种方法是 return 第一个字符串与第二个字符串相连。
对于第一种方法,它必须分配可以容纳两个字符串的新存储空间,这样就是newstring= malloc(strlen(str1)+strlen(str2)+1);
不要忘记为字符串的终止空值添加 1。
对于第二种方法,本质上是一样的,只是str1
本身必须用malloc分配,因为你的函数会调用free
或realloc
重新分配(更长的)字符串所需的存储空间。
在这两种情况下,函数看起来都像 char *stringcat(char *str1, char *str2)
。我认为有了这个输入,您可以自己编写函数的其余部分。
您正在创建一个指向 char 的 char 指针。问题是,您没有将 char 变量分配给指针,而是分配给 char 的地址。
所以,你应该改变你的:
char *ptr1 = str1
收件人:
char *ptr1 =&str1
这是因为&var
获取的是变量的地址。
然后,您还使用了 *stringptr++
,它增加了它指向的字符的 值 ,而不是地址 space。
我强烈建议您阅读 K&R 书。对于新手和已经了解 C 的人来说,这都是一本很棒的书。事实上,其中解决的问题之一就是这个。
1)
printf("%d %d", &stringcat, &stringptr);
打印变量stringcat和stringptr的地址,它们是不同的,它们被分配到堆栈中,所以,推测,你正在编译一个x64位程序,所以它们相隔8个字节。
这个
printf("%d %d", stringcat, stringptr);
就是你想要的。
我只是对您的代码进行了最少的更改以使其正常工作:
char* stringcat(const char* str1, const char* str2) {
const char *ptr1 = str1;
const char *ptr2 = str2;
int count = 0;
while (*ptr1 != '[=12=]') {
count++;
ptr1++;
}
while (*ptr2 != '[=12=]') {
count++;
ptr2++;
}
char *stringcat = (char *)malloc((count + 1) * sizeof(char));
char *stringptr = stringcat;
printf("%d %d", stringcat, stringptr);
ptr1 = str1;
ptr2 = str2;
while (*ptr1 != '[=12=]' && (*stringptr++ = *ptr1++));
printf("%c", stringcat[0]);
while (*ptr2 != '[=12=]' && (*stringptr++ = *ptr2++));
*stringptr++ = '[=12=]';
return stringcat;
}
关于问题 1,stringcat
和 stringptr
确实指向地址。不同的是&stringcat
和&stringptr
。
通过声明 char *var = malloc(...)
,您将在堆栈中保留内存 space,假设地址 30
,用于指针变量 var
,然后让 var
包含 malloc-ed 的地址,比方说地址 200
(驻留在堆内存中)。
当您继续 char *var2 = var
时,您在堆栈中保留了另一批内容来存储新的指针变量 var2
,很可能是 31
。然后,您分配 var2
来保存包含在 var
中的地址,即 200
.
因此,地址 30
和 31
中的变量都将包含地址 200
。通过使用 &var
你得到的实际上是 30
而不是你期望的 200
。当然,&var2
与值 31
不同。
对于第二个问题,很难理解您要查找的内容,因为代码中存在其他答案所反映的错误。