在C中连接两个字符串并将结果放入第三个字符串
这纯粹是为了个人利益,不是家庭作业在C中连接两个字符串并将结果放入第三个字符串,c,C,这纯粹是为了个人利益,不是家庭作业 #include <stdio.h> int main(void) { char* str3; char* str1 = "Hello"; char* str2 = "World!"; while(*str1) str1++; while(*str1++ = *str2++); return 0; } #包括 内部主(空) { char*str3; char*str1=“你好”; char*
#include <stdio.h>
int main(void)
{
char* str3;
char* str1 = "Hello";
char* str2 = "World!";
while(*str1) str1++;
while(*str1++ = *str2++);
return 0;
}
#包括
内部主(空)
{
char*str3;
char*str1=“你好”;
char*str2=“世界!”;
而(*str1)str1++;
而(*str1++=*str2++);
返回0;
}
我试图更好地理解C指针,在这样做的过程中,我希望连接两个字符串,并将结果放入第三个字符串中。上面的(不完整的)代码导致segfault,我不知道为什么。难道不可能循环指针引用的值并将数据复制到另一个地址吗
编辑:
#包括
#包括
#包括
内部主(空)
{
char*str1=“你好”;
char*str2=“世界!”;
char*str3=malloc(strlen(str1)+strlen(str2)+1);
而(*str1)*str3++=*str1++;
而(*str2)*str3++=*str2++;
看跌期权(str3);
返回0;
}
新的尝试就在上面,虽然不起作用,但是否有“明显”的项目需要修复
while(*str1) str1++;
这将前进str1
,直到它指向字符串常量末尾的终止零字节
while(*str1 = *str2++);
这会修改字符串末尾的终止零字节,但字符串是常量,因此无法修改
如果您想在内存中组装字符串,您需要在内存中分配一些空间来组装字符串,或者使用这样做的函数。你可以做:
char *new_string = malloc(strlen(str1) + strlen(str2) + 1);
strcpy(new_string, str1);
strcat(new_string, str2);
第一行分配足够的空间来容纳str1的内容、
str2的内容和终止的零字节。常量字符串不可修改。您没有修改str3。
int main(void)
{
char* str1 = "Hello";
char* str2 = "World!";
// allocate one more byte for string terminate cher ('\n')
int size = strlen(str1) + strlen(str2);
char* str3 = (char*)malloc(size + 1);
char* str_mod = str3;
while( (*str_mod++ = *str1++) != '\0');
str_mod--;
while( (*str_mod++ = *str2++) != '\0');
printf ( "%s", str3);
free (str3);
return 0;
}
你需要
获取str1和str2的长度
str1的malloc长度+长度str2+1并分配给str3
如果愿意,可以使用while循环进行复制,也可以使用strcpy和strcat将字符串复制到str3
因为您正在尝试学习,所以我尝试不为您编写代码。intmain(void){
int main (void){
char* str1 = "Hello";
char* str2 = "World";
int size1 = strlen(str1);
int size2 = strlen(str2);
int i = 0;
char* out = malloc(sizeof(char)*(size1+size2)+1);
for (i = 0; i < size1; i++){
out[i] = str1[i];
}
for (i = 0; i < size2; i++){
out[i+size1] = str2[i];
}
out[strlen(out)-1] = \0;
//out is a string.
//dont forget to free when you are done. free(out);
}
char*str1=“你好”;
char*str2=“世界”;
int size1=strlen(str1);
int size2=strlen(str2);
int i=0;
char*out=malloc(sizeof(char)*(size1+size2)+1);
对于(i=0;i
我做C已经有几个月了,但这会有用的。我的语法可能有点不正确。有问题的第二次尝试未将以null结尾的字符串放到str3
的末尾。所以,put
读取的数据超出了数据的末尾,打印垃圾,如果在读取无效地址之前并没有0字节,甚至可能崩溃。添加*str3='\0'代码>在循环之后
此外,您还修改了str3,并丢失了字符串的开头。再添加一个变量,保留由malloc
返回的指针,并将其传递给put
。当前代码将在新字符串的末尾开始打印
然后,当您有指向字符串文字的指针时,使它们指向const char,因为通常字符串文字位于只读内存区域:
const char* str1 = "Hello";
const char* str2 = "World!";
seg故障是从写入到只读存储器位置。您找到了str1
的末尾,然后立即开始在刚刚找到的位置将字符从str2
中挤出。这两个文本很可能在只读内存中,写入它们会导致灾难。@cailling:malloc(size+1)不需要类型转换为(char*)吗?@simonc I更新了我的答案以提供更多详细信息。希望这不会那么让人困惑。谢谢你的帮助。我发布了一个新的尝试(在编辑下)。如果有人能指出(双关语)新帖子中的问题,我将不胜感激。虽然我认为我已经取得了一些进展,但仍存在一定程度的困惑。例如,如果我说*ptr,它指的是ptr所指地址处的数据*ptr++根据数据类型在内存地址中移动,例如,int为4字节,等等?谢谢。@cailling您需要保存从malloc
获得的原始值,以便将其传递给put
。不要释放您不需要的东西!您还忘记了out结尾处的“\0”。您修复了以前的问题,但不幸的是,当您调用printf()
时,str3
指针超过了字符串的结尾,并且free()
调用错误,因为指针不再与从malloc()
接收到的指针相同。。。
const char* str1 = "Hello";
const char* str2 = "World!";