在c中将一个子字符串插入另一个字符串
inserting a substring into another string in c
我刚开始学习c。我正在做一个练习题如下
编写一个名为insertString
的函数,将一个字符串插入另一个字符串string.The函数的参数应包括源字符串、要插入的字符串和源字符串中的位置要插入字符串的位置。因此,使用最初定义的文本 "the wrong son"
调用 insertString (text, "per", 10);
会导致字符串 "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]!='[=10=]')
length++;
return length;
}
我已经做到了,而且效果很好。但我收到一条消息 abort trap : 6
。当我查看它时,我知道这是一个错误,因为我正在写入不属于我的内存。因为我使用了可变长度字符数组,无论 null character
在哪里,都表示数组的结尾,我试图通过插入一个字符串来扩展它,这是我的理解。到目前为止我是对的吗?
我也在移动null character
。不知道对不对
那么有没有办法解决这个错误?另外,我还不知道指针,它们在教科书的下一章。
非常感谢这方面的任何帮助。
可变长度数组是一个 very specific C construct,与教科书所说的 "variable length arrays" 无关。如果我是你,我不会相信这本说 1+1=2 的教科书。就这么多了。
以空字符结尾的字符数组被几乎所有地方的人称为 string。
char text[]="the wrong son";
您的教科书让您相信 text
可以容纳您需要的任意多个字符。 las,C 中没有这样的东西。事实上 text
将包含与它的初始值设定项中一样多的字符,再加上 1 作为空终止符,因此您不能在其中插入任何内容。
为了让您的程序运行,您需要为 text
显式分配与 结果字符串 将包含的字符一样多的字符。
所以"the wrong son"有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;
...
我刚开始学习c。我正在做一个练习题如下
编写一个名为insertString
的函数,将一个字符串插入另一个字符串string.The函数的参数应包括源字符串、要插入的字符串和源字符串中的位置要插入字符串的位置。因此,使用最初定义的文本 "the wrong son"
调用 insertString (text, "per", 10);
会导致字符串 "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]!='[=10=]')
length++;
return length;
}
我已经做到了,而且效果很好。但我收到一条消息 abort trap : 6
。当我查看它时,我知道这是一个错误,因为我正在写入不属于我的内存。因为我使用了可变长度字符数组,无论 null character
在哪里,都表示数组的结尾,我试图通过插入一个字符串来扩展它,这是我的理解。到目前为止我是对的吗?
我也在移动null character
。不知道对不对
那么有没有办法解决这个错误?另外,我还不知道指针,它们在教科书的下一章。
非常感谢这方面的任何帮助。
可变长度数组是一个 very specific C construct,与教科书所说的 "variable length arrays" 无关。如果我是你,我不会相信这本说 1+1=2 的教科书。就这么多了。
以空字符结尾的字符数组被几乎所有地方的人称为 string。
char text[]="the wrong son";
您的教科书让您相信 text
可以容纳您需要的任意多个字符。 las,C 中没有这样的东西。事实上 text
将包含与它的初始值设定项中一样多的字符,再加上 1 作为空终止符,因此您不能在其中插入任何内容。
为了让您的程序运行,您需要为 text
显式分配与 结果字符串 将包含的字符一样多的字符。
所以"the wrong son"有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;
...