我必须创建一个连接两个字符串的函数,但我必须在第一个字后添加一个'\ n'。我想出了一切,出于某种原因,它没有打印出任何东西。有任何想法吗?它可能必须用指针做一些事情。我无法理解他们。这是代码。
char *function(char *s1, char *s2){
char *newStr;
int size;
size = strlen(s1) + strlen(s2);
newStr = (char *)malloc((size+1)*sizeof(char));
while(*s1!= '\0'){
*newStr = *s1;
newStr++;
s1++;
}
*newStr = '\n';
newStr++;
while(*s2 != '\0'){
*newStr = *s2;
newStr++;
s2++;
}
*newStr = '\0';
return newStr;
}
int main (int argc, const char * argv[]) {
char *str1 = "Hello";
char *str2 = "World";
printf("%s",function(str1, str2));
return 0;
}
因此,我应该得到:
Hello
World
但我没有得到任何回报。
答案 0 :(得分:4)
您正在返回指向缓冲区末尾的指针,而不是指向缓冲区开头的指针。看看函数的最后两行:
*newStr = '\0';
return newStr;
显然,这会返回一个指向null char
的指针,即空字符串。
通过引入一个临时指针解决问题,该指针将用于逐步执行输出缓冲区。然后,您可以将指针返回到输出缓冲区的开头。
char *function(char *s1, char *s2){
int size = strlen(s1) + strlen(s2) + 2;//one for '\n', one for '\0'
char *result = malloc(size);
char *p = result;
while(*s1 != '\0'){
*p = *s1;
p++;
s1++;
}
*p = '\n';
p++;
while(*s2 != '\0'){
*p = *s2;
p++;
s2++;
}
*p = '\0';
return result;
}
您还需要为\n
分配额外的字符,如上所示。最后,您的调用代码永远不会释放由function
分配的内存。
答案 1 :(得分:0)
我会看看两件事:
答案 2 :(得分:0)
从function()
返回指向已分配char[]
中最后一个元素的指针 - 而不是将指针返回到第一个元素。
每次执行newStr++;
时,都会增加实际指针,然后再返回。为了解决这个问题,你可以做以下其中一个:
newStr
的副本,该指针初始化为与newStr
相同并增加它 - 保持原样newStr
。i
]并增加它,并使用newStr[i]
访问已分配的数组。答案 3 :(得分:0)
我已经为你调试了代码。这是调试代码:
char *function(char *s1, char *s2) {
char *newStr, *str;
int size;
size = strlen(s1) + strlen(s2);
newStr = (char *) malloc((size + 2) * sizeof(char));
str = newStr;
while (*s1 != '\0') {
*(newStr++) = *(s1++);
}
*newStr = '\n';
newStr++;
while (*s2 != '\0') {
*newStr = *s2;
newStr++;
s2++;
}
*newStr = '\0';
return str;
}
int main(int argc, const char *argv[]) {
char *str1 = "Hello";
char *str2 = "World";
printf("%s", function(str1, str2));
return 0;
}
实际问题是,当你将newStr递增到最后一次时,当你从function()
返回它时,它指向缓冲区的末尾。即'\0'
。这就是它没有出现的原因。现在在上面的代码中,我引入了一个变量str
,它指向字符串newStr
的开头。
...和平