【问题标题】:C Pointers Problem Concatenating StringsC 指针问题连接字符串
【发布时间】:2011-09-03 21:38:46
【问题描述】:

我正在做一些练习,并尝试仅使用指针(无字符数组)连接两个字符串。 我的代码似乎可以编译(注意:我使用的是旧的 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


【解决方案1】:

您声明的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 */

【讨论】:

  • 问题来自 K&R。它特别指出使用指针连接字符串。
  • @JJG:检查编辑,看看这是否回答了你的问题。您实现的是指针用法,但不幸的是,指针 无法写入 的地址内容按照标准,无法写入字符串文字。通过使用动态内存分配,内存通常会从堆中分配,您可以更改它。对于数组,它通常也存储在您可以编写的堆栈中。
  • 我现在正在消化你的回答。似乎没有办法对任意 str1 和 str2 执行 strcat。我们必须事先知道它们的大小,对吗?
  • 查看两个字符串的长度是否分别为n,那么连接最多为2n,因此您应该保留2n的大小。
  • 您不应该将"Man" 字符串复制到str2 并为str2 分配内存吗?
【解决方案2】:

您的代码不起作用。为了迂腐,它会调用未定义的行为,因为您正在尝试修改字符串文字的内容。

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

str1 指向位于 const 内存位置的“first”。

您应该拥有一个具有足够容量的字符数组,而不是指向字符串文字的指针,以便保存连接的字符串"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;
}   

在线演示here

【讨论】:

  • 问题来自著名的K&R参考书。练习说明:“编写函数 strcat 的指针版本... ...strcat(s,t) 将字符串 t 复制到 s 的末尾。”如果我的方法从一开始就有缺陷,我该怎么做?
  • 感谢您的帮助。我的一个小问题是 str1 是一个预定义的 char 数组。感觉这与使用指针的问题的精神背道而驰。
【解决方案3】:

引自 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.

您的目标字符串不够大

【讨论】:

    【解决方案4】:

    你需要一个可写且足够大的缓冲区来写入,就像这样

    char str1[32] = "first";
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-02
      • 2011-12-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多