C指针问题 串联字符串的问题

问题描述 投票:4回答:4

我正在做一些练习,并试图只用指针(没有char数组)来连接两个字符串.我的代码似乎可以编译(注:我使用的是旧的16位Open Watcom编译器)。

#include <stdio.h>

int main(){
  char *str1 = "first";
  char *str2 =" second";

  strcat2(str1,str2);

  for(;*str1!='\0';str1++){
      printf(str1);
  }

  return 0;
}

int strcat2(char *s,char *t){
  for(;*s!='\0';s++){
    ;
  }

  while((*s++ = *t++)!='\0'){
    ;
  }

  *t++;
  t='\0';

  return 0;
}

当我试图运行它时,什么都没有发生。我确信我的上述工作存在可怕的缺陷。任何建议和帮助都将是非常感激的。

c pointers concatenation
4个回答
4
投票

str1str2 声明的是字符串字元,不能修改。在linux可执行文件中,地址中的内容是由 str1str2 指向是存储在 .rodata 的不可写部分。在其他可执行文件中,内容被存储在类似的不可写的位置。你应该使用一个数组或动态分配的内存区域来完成这项工作。确保在连通你要粘贴的字符串时,另一个字符串有足够的空间来容纳它们两个。

EDIT1:

要么做

char str1[BUFF_SIZ] = "Hello", str2[BUFF_SIZ] = " Man";
/* Now do strcat */ 
/* The strlen (str1) + strlen (str2) should be lessthan BUFF_SIZ */

char *str1, *str2;
str1 = malloc (sizeof (char) * BUFF_SIZ);
str2 = malloc (sizeof (char) * BUFF_SIZ);
strcpy (str1, "Hello");
strcpy (str2, " Man");
/* Now do strcat */ 
/* The strlen (str1) + strlen (str2) should be lessthan BUFF_SIZ */

1
投票

你的代码不会工作。说得迂腐一点,它调用了未定义的行为,因为你正在尝试修改一个字符串文字的内容。

char *str1 = "first";
char *str2 =" second";

str1 指向 "first",它位于const内存位置。

与其说你有一个指向字符串文字的指针,不如说你应该有一个容量足够大的字符数组,这样才能容纳连接的字符串。"firstsecond"

这和预期的一样

#include <stdio.h>
int strcat2(char *s,char *t){    
   for(;*s!='\0';s++){
   }
   while((*s++ = *t++)!='\0'){        
   }
   t='\0';
   return 0;
}
int main(){
  char str1[15] = "first";
  char *str2 =" second";

  strcat2(str1,str2);
  printf("%s",str1);
  return 0;
}   

在线演示 此处


0
投票

引用man:strcat的一句话。

  char * strcat ( char * destination, const char * source );
  ...
  Parameters
  destination
  Pointer to the destination array, which should contain a C string, and be large enough to contain the concatenated resulting string.

你的目标字符串不是 够大.


0
投票

你需要一个可写和足够大的缓冲区,就像这样。

char str1[32] = "first";
© www.soinside.com 2019 - 2024. All rights reserved.