在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!";