回答編集履歴

1 追記

ttyp03

ttyp03 score 13589

2016/10/31 09:10  投稿

詳しく原因は調べていませんが、strcpyなどを安易に使っているのが原因でしょう。
C言語では文字列の挿入関数はありませんから、自力で組み込む必要があります。
手順としては以下になります。
入力が "2 Aizu" の場合。
(1) 元のバッファを用意
buf="[Wakamatsu]"
(2) 挿入位置以降の文字列を入力文字列長分ずらしておく。[]の分を含めて+2文字。
buf="[W------akamatsu]"
(3) 空けた場所に入力文字列を入れる
buf="[W[Aizu]akamatsu]"
これをコード化したのが以下です(ループ内のみ抜粋)
```c
scanf("%d %s",&n,str);
sprintf(rbuf,"[%s]",str);
/* ずらす */
for(i = strlen(buf)-1; i >= n; i--){
   buf[i + strlen(rbuf)] = buf[i];
}
/* 入れる */
for(i = 0; i < strlen(rbuf); i++){
   buf[n + i] = rbuf[i];
}
printf("bufは%s\n",buf);
```
上記を更に標準関数を利用したのが以下です(memmoveを使っているところがポイントです)
```c
scanf("%d %s",&n,str);
sprintf(rbuf,"[%s]",str);
/* ずらす */
memmove(&buf[n + strlen(rbuf)], &buf[n], strlen(&buf[n]));
/* 入れる */
memcpy(&buf[n],rbuf,strlen(rbuf));
printf("bufは%s\n",buf);
```
```
C言語はNULL文字までで一つの文字列を解釈されますから、文字列を編集するときはNULLを意識して処理するようにしてください。

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る