C言語 初心者です。

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

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

回答の条件
  • 1人1回まで
  • 登録:2007/09/12 00:57:32
  • 終了:2007/09/13 05:55:55

回答(6件)

id:cx20 No.1

cx20回答回数607ベストアンサー獲得回数1082007/09/12 01:32:48

ポイント10pt

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

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

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

id:keronimo

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

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

2007/09/12 07:20:21
id:Kumappus No.2

くまっぷす回答回数3784ベストアンサー獲得回数1852007/09/12 01:36:27

ポイント200pt

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

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

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

  • (文字列の配列が30byteと少ない)
  • 入力文字列の長さチェックがない
  • 挿入後文字列の長さチェックがない

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

id:keronimo

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

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

2007/09/12 07:24:28
id:noboru No.3

noboru回答回数94ベストアンサー獲得回数02007/09/12 01:38:47

ポイント10pt

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

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

id:yo-kun No.4

yo-kun回答回数220ベストアンサー獲得回数302007/09/12 01:50:29

ポイント10pt

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

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

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


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



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

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

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

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


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

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

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

とすればOKです。

id:paraizo No.5

paraizo回答回数139ベストアンサー獲得回数102007/09/12 02:43:43

ポイント10pt

最後の

*s = '\n';

*s = '\0';

に変えましょう

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

id:KUROX No.6

KUROX回答回数3542ベストアンサー獲得回数1402007/09/12 08:06:32

ポイント10pt

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

C言語では言語仕様で初期化されません。

速度を追い求めるプログラム以外では、明示的に初期化する

のが普通だと思います。バグも減らせます

http://www9.plala.or.jp/sgwr-t/c/sec05.html

scanf("%s" で取得したものは最後\0が付く

----------------------------

void strnins( char* s, int n, char* t )

以下、なんとなく読みにくいです。

strcopy,memcopyとか使ったほうがシンプルにかけそう

なのですが・・。

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません