-1

c を学び始めたところです。私は演習を行っていますが、質問は次のとおりです。

ある文字列を別の文字列に挿入するために呼び出される関数を作成します。関数insertStringの引数は、ソース文字列、挿入する文字列、および文字列を挿入するソース文字列内の位置で構成する必要があります。insertString (text, "per", 10);そのため、最初に定義された text を使用して呼び出すと、 text 内に から始まる"the wrong son"文字列"per"が挿入されます。したがって、関数が返された後、text[10]文字列"the wrong person"は text 配列内に格納されます。

#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には、イニシャライザにあるのとまったく同じ数の文字に加えて null ターミネータの 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 に答える