こんばんわ。
久々にC言語を扱う機会があり、作成済のソースファイルをメンテナンスする事になったんですが、いざコンパイル(make)した時に、色々調べたりした内容を記事として纏めました。
※本シリーズは、都度作成しようと考えてます。
問題となるコード
期待する動作は、以下となります。
・「buf1に”abcdeABCDE”」を設定したい
char buf1[11];
char buf2[6];
strcpy(buf1, "abcde");
strcpy(buf2, "ABCDE");
sprintf(buf1, "%s%s", buf1, buf2);
どこが問題となるでしょうか?
原因
上記で問題となるのは、sprintf()の使い方です。
sprintf()文ではoutputとinputに同じ変数を指定する事は、C標準では未定義(どのような結果になるか分からない)です。
(本例だと、第1引数(output)と第3引数(input)に同じ変数(buf)を指定しているので、ワーニングが出ている)
※なお、未定義とはいえ、ほとんどの処理系では期待した結果が得られます。(「buf1に”abcdeABCDE”」が設定される)
対処
strcat()関数などを用いて連結します。(あくまで一例です)
char buf1[11];
char buf2[6];
strcpy(buf1, "abcde");
strcpy(buf2, "ABCDE");
strcat(buf1, buf2);
一応補足すると、memcpy()でも同様の結果が得られます。
個人的には、取り扱う対象のデータ型(今回の場合は文字列※)によって、利用する関数やコーディングを変更・選択するのが、よりベターと考えているので、今回はstrcat()を紹介しました。
※変数型(char)という事ではなく、変数に”abcde”,”ABCDE”と設定しており、文字列を設定していることを指しています。
コメント