質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Q&A

解決済

2回答

12410閲覧

文字配列を別の文字配列にコピーする

kyu0224

総合スコア12

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

1グッド

1クリップ

投稿2016/12/03 18:07

編集2016/12/03 19:28

コンソールアプリケーションです。
2つの文字列を宣言し、一方の文字配列に文字列を与え、もう一方の文字配列にコピーし、表示をしたいのですが

下記のコードを書いたのですが

#include <stdio.h>

int main(void)
{
//ここで文字列を宣言
char a[] = "mojiretsu";
char b[9];

//aの[i]番目にNULL文字が入ったときループ終了
for (int i = 0; a[i] != NULL; i++)
{
//bの[i]番目にaの[i]番目を入れる
b[i] = a[i];
}

//ここで表示
printf("【実行結果】\n");
printf("a = %s\n", a);
printf("b = %s\n", b);

return 0;
}

実行結果が
a = mojiretsu
b = mojiretsuフフフフフフフフフフフmojiretsu
となりaの値はちゃんと表示されるのですがbがちゃんと表示できません。
これは何が原因なのでしょうか?
またフフフフフフフフフフフっていうのは何の文字が入ってるのでしょうか?

kazuyakazuya👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

こんにちは。

C言語の文字列は最後に0が入っています。

  1. "mojiretsu"は9文字あるので、最後の0を加えるので配列としては10文字必要です。
  2. コピー・ループは最後の 0 をコピーしていません。

printf()関数は、文字列の終わりを最後の 0 で判定します。
しかし、bには最後の 0 が入っていないため、そのまま 0 が来るまで出力をし続けます。
そのため、謎の文字列フフフフフフフフフフフが表示されてしまいます。
たまたま早期に0が有ったので大量に謎の文字が表示されなかったのだと思います。


ところで、C++タグがついてますが、C言語ですよね?

投稿2016/12/03 19:00

Chironian

総合スコア23272

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kyu0224

2016/12/03 19:22

ご回答ありがとうございます。 c++タグの件、ご指摘ありがとうございます。  c++ばかりやっていたもので、混合しておりました。修正します。 失礼いたしました。  分かりやすい解説ありがとうございました! b[sizeof(b) - 1] = NULL; を追加してみたところ、うまく表示することができました!
guest

0

ベストアンサー

char配列のコピーはfor文を回して自前で代入するのではなく、strcpy関数を使うのが楽です。

bprintf表示されるのは、おそらく「b+NULL以外の文字+a」でしょう。
printfchar配列を表示する場合、配列の先頭からNULLの直前までを表示します。
bの末尾にNULLが無かったため、NULLが最初に出現するaの末尾の直前までの文字列が表示されている状態だと思います。

投稿2016/12/03 18:58

編集2016/12/03 19:01
carimatics

総合スコア740

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kyu0224

2016/12/03 19:22

ご回答ありがとうございます。 分かりやすい解説で、助かります! b[sizeof(b) - 1] = NULL; を追加してみたところ、うまく表示することができました! お早い回答だったのでBAにいたしました。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問