人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

C言語 初心者です。
自分で入力した文字列へ、自分で指定した位置に文字列を挿入するプログラム。どこがいけないのか、解決方法を指摘して下さい。200P進呈!

編集方法が分からずとても見づらいです。
http://d.hatena.ne.jp/keronimo/20070912

●質問者: keronimo
●カテゴリ:コンピュータ
✍キーワード:プログラム 入力 初心者 文字列 編集
○ 状態 :終了
└ 回答数 : 6/6件

▽最新の回答へ

1 ● cx20
●10ポイント

どこがいけないのか、解決方法を指摘して下さい

例示されたプログラムコードを実行してみたところ、変な値が入ることを確認しました。

C言語では、配列は初期化しない場合、不定値が入っています。

とりあえず、初期化するコードを入れてみてください。

初期化の方法は色々ありますが、とりあえす、2つ例示します。

/* 配列の要素を '\0' で初期化 */
char moji1[30] = { 0 };
char moji2[30] = { 0 };
/* memset() 関数を使用 */
memset( moji1, '\0', sizeof(moji1) );
memset( moji2, '\0', sizeof(moji2) );

編集方法が分からずとても見づらいです。

はてなダイアリーでは、プログラムを色分け表示することが可能です。

 >|c|
 /* プログラムコード */
 ||<

のように記述してみてください(※ ↑先頭のスペースは入れる必要はありません)

■ 入力したプログラムコードを色付けするスーパーpre記法 シンタックス・ハイライトの実装について

http://d.hatena.ne.jp/hatenadiary/20061215/1166155734

◎質問者からの返答

初期化ですか。基本的な事が抜けていると同時に、初期化の方法も分かっていませんでした。

初期化の有無で結果が変わるんですか・・・


2 ● くまっぷす
●200ポイント

おかしいというのは結果の文字列が崩れる というか 後ろにごみがつく、ですね。

//残った文字列をつける
 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'を間違えた?

ただ文字列挿入のプログラムにしては

などかなりいろいろ問題があります。

◎質問者からの返答

多分ズバリな気がします!別の問題でも同じ事していました。

問題点についてはご指摘の通り・・ですが、研修用なのでロジックが動けば良い事になっています。


3 ● noboru
●10ポイント

惜しいですね。*taihi = '\n'; や *s = '\n'; の '\n' の代わりに '\0' を入れるとどうですか? 多分できると思いますが。(但しこのプログラムの場合は文字列全体で29バイト以内に収まらないと駄目です)。

どういうことかというと、C言語のライブラリの大半は歴史的な理由で文字列の最後を '\0' で表すようにしているためで、printf() などの標準的な関数もそれに従って作られているからです。


4 ● yo-kun
●10ポイント

strnins関数の中で文字列終端として'¥0'でなく'¥n'を付け足してしまっています。

2箇所ありますが、動作に決定的なのは最後のほうです。

'¥n'は'¥0'に直しましょう。('¥n'は改行です)


そうしないと挿入後の文字列がどこで終わるか分かりません。



また、一般的な話ですが、例えば文字列"abcde"があったら、

位置が1の箇所とは通常はaとbの間のことを指します。

(一番左、aの左は0です。)

大抵のプログラミング言語での文字列操作はそうなっているはずです。


混乱しないように一般的な実装にするには

s = s + n - 1 ; //挿入先sのポインタを挿入位置までずらす

s = s + n ; //挿入先sのポインタを挿入位置までずらす

とすればOKです。


5 ● paraizo
●10ポイント

最後の

*s = '\n';

*s = '\0';

に変えましょう

Cの文字列終端記号は\0です


1-5件表示/6件
4.前の5件|次5件6.
関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ