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

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

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

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

Q&A

解決済

2回答

1145閲覧

サンプルの不具合について

退会済みユーザー

退会済みユーザー

総合スコア0

C

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

0グッド

1クリップ

投稿2016/09/14 09:04

/* mystrcat02.c */ #include <stdio.h> char *mystrcat(char *, char *); int main() { char str1[32] = "Hello, "; char str2[16] = "World!\n"; printf(mystrcat(str1, str2)); return 0; } char *mystrcat(char *a, char *b) { char *aorg; aorg = a; while (*a) a++; while (*a++ = *b++); return aorg; }

こんばんは。とある本でC言語を勉強しています。
サンプルプログラムを実行するとエラーがでます。どこが駄目なのか分からないので、分かる方は修正して頂けたら嬉しいです。

while (*a) a++; while (*a++ = *b++);

あと、この部分がわからないのでどなたか解説をできたらでいいんですけど、してもらえると助かります。

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

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

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

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

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

moonphase

2016/09/14 09:34

実行環境を教えて下さい。 CentOS6+GCCでは問題なく実行できました。
退会済みユーザー

退会済みユーザー

2016/09/14 09:38

Wandboxというサイトです。
HiroshiWatanabe

2016/09/14 09:44

どういうエラーが出るんでしょうか?
退会済みユーザー

退会済みユーザー

2016/09/14 09:50

prog.cc: In function 'char* mystrcat(char*, char*)': prog.cc:25:14: warning: suggest parentheses around assignment used as truth value [-Wparentheses] while (*a++ = *b++); ~~~~~^~~~~~ というエラーです。
HiroshiWatanabe

2016/09/14 10:10

エラーではなく警告ですね。 while (*a++ = *b++); が「代入」になっていて「真偽判定結果」の体裁ではないので ループの真偽判定を間違ってる可能性があるので注意してね という意図での警告です。(=と==を間違えていませんか?という警告) 意図通りなら無視しても構いませんし while ((*a++ = *b++) != '\0'); のように明示的に真偽判定の体裁になるようにしてみるのでもいいです。
guest

回答2

0

ベストアンサー

CentOS6+GCCでは問題なく動作しました。

以下は、ポインタaを文字列の最後についている\0まで進めています。
whileは0の場合はループを抜けます。

while (*a) a++;

以下は、ポインタbの内容をポインタaの最後に追加しています。
bのポインタの指す内容が文字列の終端を示す\0に到達すると、それがaの指すポインタにコピーされた上で、whileが終了します。

while (*a++ = *b++);
char str1[32] = "Hello, ";

は次の内容が設定されています。

str1[0] = 'H'; str1[1] = 'e'; str1[2] = 'l'; str1[3] = 'l'; str1[4] = 'o'; str1[5] = ','; str1[6] = ' '; str1[7] = '\0'; ←文字列の終端は`\0`というお約束です str1[8-31] = 不定

追記

以下はエラーではなくワーニングです。

prog.cc: In function 'char* mystrcat(char*, char*)': prog.cc:25:17: warning: suggest parentheses around assignment used as truth value [-Wparentheses] while (*a++ = *b++); ~~~~~^~~~~~

以下のようにするとワーニングが消えます。

while ((*a++ = *b++));

他の方が回答している、printfの第一引数はフォーマットを指定するものではありますが、
フォーマッタ識別子が含まれていないものはそのまま出力されるので、プログラムとしては間違っていません。

投稿2016/09/14 09:39

編集2016/09/14 09:43
moonphase

総合スコア6621

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

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

archiver

2016/09/14 09:46

そういえばそうですね。固定文字列のアドレスを渡していることになるので、間違いではないですね。
guest

0

printfで表示するときは書式フォーマットを指定する必要があります。printfの使い方は調べてください(すぐ見つかるでしょう)。

2つ目ですが、aに対してbの内容を繋げるのがmystrcatの処理です。最初の

C

1while (*a) 2 a++;

では、aの終端位置までポインタを進めています。そして、次の

C

1while(*a++ = *b++);

で、aの続きの位置からbの内容をコピーしています。

投稿2016/09/14 09:21

archiver

総合スコア1557

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問