-1

我刚开始学习 c。我正在做一个练习,问题如下。

编写一个调用函数insertString,将一个字符串插入另一个字符串。函数的参数应该包括源字符串、要插入的字符串以及要插入字符串的源字符串中的位置。因此,insertString (text, "per", 10);使用最初定义的文本的调用"the wrong son"导致字符串"per"被插入到文本中,从 . 开始text[10]。因此,在函数返回后,字符串"the wrong person"存储在文本数组中。

#include<stdio.h>
int insertString(char[],char[],int);
int stringLength(char[]);
int main()
{
  char text[]="the wrong son";
  int result=insertString(text,"per",10);
  if(result!=-1)
    printf("string 1 is : %s \n",text);
  else
    printf("Not possible\n");
  return 0;
}
int insertString(char a[],char b[],int pos)
{
  int i=0,j=0;
  int lengthA=stringLength(a);
  int lengthB=stringLength(b);
  if(pos>lengthA)
    return -1;

  for(i=lengthA;i>=pos;i--)
      a[i+lengthB]=a[i];

  for ( i = 0; i < lengthB; ++i )
      a[i + pos] = b[i];

  return 1;
}
int stringLength(char x[])
{
  int length=0;
  while(x[length]!='\0')
    length++;
  return length;
}

我已经做到了,它也在工作。但我收到一条消息abort trap : 6。当我查看它时,我了解到这是一个错误,因为我正在写入我不拥有的内存。因为我使用了可变长度字符数组,无论在哪里,null character都表示数组的结尾,我试图通过插入一个字符串来扩展它,这是我的理解。到目前为止我是对的吗?

我也在搬家null character。我不知道是对还是错。

那么有没有办法解决这个错误?另外,我还不知道指针,它们在教科书的下一章

对此的任何帮助将不胜感激。

4

1 回答 1

2

可变长度数组是一种非常特殊的 C 构造,与您的教科书所说的“可变长度数组”无关。如果我是你,我不会相信这本教科书,如果它说 1+1=2。这么多。

以空字符结尾的字符数组被几乎所有地方的每个人称为字符串。

char text[]="the wrong son";

你的教科书让你相信它text可以容纳你需要的尽可能多的字符。唉,C 中没有这样的东西。事实上,text它将包含与其初始值设定项中的字符一样多的字符,加上 1 作为空终止符,因此您不能在其中插入任何内容。

为了让您的程序正常工作,您需要显式分配与结果字符串一样多text字符

因此,由于“错误的儿子”中有 14 个字符(包括终止符),“per”中有 3 个字符(不包括终止符),所以总共需要 17 个字符:

char text[17]="the wrong son";

您还可以检查您的计算:

int result=insertString(text, "per", 10, sizeof(text));
...
int insertString(char a[], char b[], int pos, int capacity)
{
   ...
   if (lengthA + lengthB + 1 < capacity) 
     return -1;
   ...
于 2016-04-14T17:51:55.047 回答