0

私はこのコードを持っています:

//function to delete the occurence of c in s
void squeeze(char s[], int  c) {
  int i,j;
  for(i=j=0;s[i]!='\0';i++)
    if(s[i]!=c)
       s[j++]=s[i];
  s[j]='\0';
}

//function to concatenate string 
void strca(char c[],char b[]){
  int i,j;
  i=j=0;
  while(c[i]!='\0')
    i++;
  c[i++]=' ';
  while((c[i++]=b[j++])!='\0')
    ;
}

main() で関数を呼び出すと、

int main(void){
 1 char test[]="carmakarchile";
 2  //squeeze(test,'a');
 3 //printf("%s\n",test);
 4 char f[]="Magnificent";
 5 char n[]="King Rex";
 6 strca(f,n);
 7 squeeze(test,'a');
 8 printf("%s\n",test);
 9 printf("%s",f);
  }

opを与える:

   King Rex
   Magnificent King Rex

2行目と3行目のコメント行を削除し、7行目と8行目にコメントを入れると、次のようになります。

      crmkrchile
      Magnificent King Rex

なぜ、どのように違いが生じるのか知りたいだけですか?前もって感謝します

4

2 に答える 2

2
char f[]="Magnificent";

配列を、0 ターミネータを含むf文字列を保持するのに十分な大きさにします。"Magnificent"

char n[]="King Rex";
strca(f,n);

喜んで配列の境界外に書き込み、未定義の動作を呼び出します。この場合、明らかに他の配列を上書きしますtest

連結の結果を保持するのに十分な大きさの配列を宣言すると、

char f[32] = "Magnificent";

たとえば、すべてが正しく機能します。

于 2013-04-24T18:34:25.127 に答える
0

concatenate 関数は c[] 配列を超えて書き込みます。文字列を連結したい場合は、両方の文字列が収まるのに十分なメモリを割り当てる必要があります (終了を含む\0)。

あなたの例では、 f[] と n[] の両方がたまたまメモリ内で隣り合っていることは「幸運」であるため、終端の null を空白に置き換えると、連結された文字列のように見えます.

于 2013-04-24T18:37:01.537 に答える