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