自分で入力した文字列へ、自分で指定した位置に文字列を挿入するプログラム。どこがいけないのか、解決方法を指摘して下さい。200P進呈!
編集方法が分からずとても見づらいです。
http://d.hatena.ne.jp/keronimo/20070912
どこがいけないのか、解決方法を指摘して下さい
例示されたプログラムコードを実行してみたところ、変な値が入ることを確認しました。
C言語では、配列は初期化しない場合、不定値が入っています。
とりあえず、初期化するコードを入れてみてください。
初期化の方法は色々ありますが、とりあえす、2つ例示します。
/* 配列の要素を '\0' で初期化 */ char moji1[30] = { 0 }; char moji2[30] = { 0 };
/* memset() 関数を使用 */ memset( moji1, '\0', sizeof(moji1) ); memset( moji2, '\0', sizeof(moji2) );
編集方法が分からずとても見づらいです。
はてなダイアリーでは、プログラムを色分け表示することが可能です。
>|c| /* プログラムコード */ ||<
のように記述してみてください(※ ↑先頭のスペースは入れる必要はありません)
■ 入力したプログラムコードを色付けするスーパーpre記法 シンタックス・ハイライトの実装について
おかしいというのは結果の文字列が崩れる というか 後ろにごみがつく、ですね。
//残った文字列をつける int i; for ( i = 0; i < count; i++ ) { *s = tmp_moji[i]; s++; } *s = '\n'; }
これでは文字列sの末尾に'\0'が入っていないからです。
なので
//残った文字列をつける int i; for ( i = 0; i < count; i++ ) { *s = tmp_moji[i]; s++; } *s = '\n'; *++s = '\0'; }
でとりあえずうまくいきます。
それともひょっとして'\n'と'\0'を間違えた?
ただ文字列挿入のプログラムにしては
などかなりいろいろ問題があります。
多分ズバリな気がします!別の問題でも同じ事していました。
問題点についてはご指摘の通り・・ですが、研修用なのでロジックが動けば良い事になっています。
惜しいですね。*taihi = '\n'; や *s = '\n'; の '\n' の代わりに '\0' を入れるとどうですか? 多分できると思いますが。(但しこのプログラムの場合は文字列全体で29バイト以内に収まらないと駄目です)。
どういうことかというと、C言語のライブラリの大半は歴史的な理由で文字列の最後を '\0' で表すようにしているためで、printf() などの標準的な関数もそれに従って作られているからです。
strnins関数の中で文字列終端として'¥0'でなく'¥n'を付け足してしまっています。
2箇所ありますが、動作に決定的なのは最後のほうです。
'¥n'は'¥0'に直しましょう。('¥n'は改行です)
そうしないと挿入後の文字列がどこで終わるか分かりません。
また、一般的な話ですが、例えば文字列"abcde"があったら、
位置が1の箇所とは通常はaとbの間のことを指します。
(一番左、aの左は0です。)
大抵のプログラミング言語での文字列操作はそうなっているはずです。
混乱しないように一般的な実装にするには
s = s + n - 1 ; //挿入先sのポインタを挿入位置までずらす
を
s = s + n ; //挿入先sのポインタを挿入位置までずらす
とすればOKです。
>初期化の有無で結果が変わるんですか・・・
C言語では言語仕様で初期化されません。
速度を追い求めるプログラム以外では、明示的に初期化する
のが普通だと思います。バグも減らせます
http://www9.plala.or.jp/sgwr-t/c/sec05.html
scanf("%s" で取得したものは最後\0が付く
----------------------------
void strnins( char* s, int n, char* t )
以下、なんとなく読みにくいです。
strcopy,memcopyとか使ったほうがシンプルにかけそう
なのですが・・。
初期化ですか。基本的な事が抜けていると同時に、初期化の方法も分かっていませんでした。
初期化の有無で結果が変わるんですか・・・