新・明解 C言語 演習11-3を解けなくて困っています。

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
Bulls
記事: 1
登録日時: 2年前

新・明解 C言語 演習11-3を解けなくて困っています。

#1

投稿記事 by Bulls » 2年前

参考問題を書きかえて、str_copy関数の呼び出しをprintf関数の実引数とするプログラムを作成せよ。

<参考問題>
#include <stdio.h>

char *str_copy(char *d, const char *s)
{
char *t = d;

while (*d++ = *s++);

return t;
}

int main(void)
{
char str[128] = "ABC";
char tmp[128];

printf("str = \"%s\"\n", str);

printf("コピーするのは : ", tmp);
scanf("%s", tmp);

str_copy(str, tmp);

puts("コピーしました。");
printf("str = \"%s\"\n", str);

return 0;
}

<私の回答>
#include <stdio.h>

char *str_copy(char *d, const char *s)
{
char *t = d;

while (*d++ = *s++);

return t;
}

int main(void)
{
char str[128] = "ABC";
char tmp[128];

printf("str = \"%s\"\n", str);

printf("コピーするのは : ");
scanf("%s", tmp);

puts("コピーしました。");
printf("str = \"%s\"\n", str_copy(str, tmp));

return 0;
}

<参考問題>
str = "ABC"
コピーするのは : 4
コピーしました。
str = "4"

私の回答をコンパイルしましたが、以下のようにエラーになってしまいます。指摘された点をそのまま直すとコピー後も"ABC"と表示されます。
どこが間違っているのか何が足りないのか教えていただけますでしょうか。

<エラー内容>
enshu11-3.c:7:14: warning: using the result of an assignment as a condition without parentheses [-Wparentheses]
while (*d++ = *s++);
~~~~~^~~~~~
enshu11-3.c:7:14: note: place parentheses around the assignment to silence this warning
while (*d++ = *s++);
^
( )
enshu11-3.c:7:14: note: use '==' to turn this assignment into an equality comparison
while (*d++ = *s++);
^
==
enshu11-3.c:23:27: error: cannot take the address of an rvalue of type 'char *'
printf("str = \"%s\"\n", &str_copy(str, tmp));

よろしくお願いいたします。

アバター
あたっしゅ
記事: 663
登録日時: 13年前
住所: 東京23区
連絡を取る:

Re: 新・明解 C言語 演習11-3を解けなくて困っています。

#2

投稿記事 by あたっしゅ » 2年前

東上☆海美☆「
載ってたリストに、ちょっと手を加えて、ビルドしてみましたが、

コード:

//
// https://dixq.net/forum/viewtopic.php?f=3&t=21172&sid=b0cf7c7a36bea9c8629441e7defc7e74
// ファイル操作についてです。 - ミクプラ(ja)
//
// for VS2019
//
#define _CRT_SECURE_NO_WARNINGS

//<参考問題>
#include <stdio.h>

char*
str_copyA(char* d, const char* s)
{
	char* t = d;

	while (*d++ = *s++);

	return t;
}


int
mainA(void)
{
	char str[128] = "ABC";
	char tmp[128];

	printf("mainA: str = \"%s\"\n", str);

	//printf("コピーするのは : ", tmp);
	printf("mainA: コピーするのは : " );
	scanf("%s", tmp);

	str_copyA(str, tmp);

	puts("mainA: コピーしました。");
	printf("mainA: str = \"%s\"\n", str);

	return 0;
}


//<私の回答>
//#include <stdio.h>

char*
str_copy(char* d, const char* s)
{
	char* t = d;

	while (*d++ = *s++);

	return t;
}


int
main(void)
{
	char str[128] = "ABC";
	char tmp[128];

	mainA();

	printf("str = \"%s\"\n", str);

	printf("コピーするのは : ");
	scanf("%s", tmp);

	puts("コピーしました。");
	printf("str = \"%s\"\n", str_copy(str, tmp));

	return 0;
}


// end.
出力は

コード:

mainA: str = "ABC"
mainA: コピーするのは : 1
mainA: コピーしました。
mainA: str = "1"
str = "ABC"
コピーするのは : 2
コピーしました。
str = "2"
別に問題は、ないみみ。


> enshu11-3.c:23:27: error: cannot take the address of an rvalue of type 'char *'
> printf("str = \"%s\"\n", &str_copy(str, tmp));


エラーの方には、&str_copy(str, tmp) と、str_copy に、& が、ついてるみみ。


警告やノートの方は、
昔のコードに対して、
今の規格だと「何が起こるかわからない」けど、
今、昔の解釈でコンパイルできないと、困りますから、昔風の解釈で通しますが、
将来は保証しませんよ、
ぐらいみみ ?
VTuber:
東上☆海美☆(とうじょう・うみみ)
http://atassyu.php.xdomain.jp/vtuber/index.html
レスがついていないものを優先して、レスするみみ。時々、見当外れなレスしみみ。

中の人:
手提鞄あたッしュ、[MrAtassyu] 手提鞄屋魚有店
http://ameblo.jp/mratassyu/
Pixiv: 666303
Windows, Mac, Linux, Haiku, Raspbery Pi, Jetson Nano, 電子ブロック 持ち。

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: 新・明解 C言語 演習11-3を解けなくて困っています。

#3

投稿記事 by みけCAT » 2年前

Bullsさんへ
ソースコードを提示する際は、BBCodeが有効な(無効にしない)状態で、
BBCodeのcodeタグの開始タグと終了タグの組(開始タグが先)で囲んでいただけると、
見やすくてありがたいです。
あたっしゅ さんが書きました:
2年前
警告やノートの方は、
昔のコードに対して、
今の規格だと「何が起こるかわからない」けど、
今、昔の解釈でコンパイルできないと、困りますから、昔風の解釈で通しますが、
将来は保証しませんよ、
ぐらいみみ ?
「ループの中で代入をするというのは不自然だ。本当は比較をしたいんじゃないの?」
という意味ですね。
「いやここは代入で合ってる!」という場合は、

コード:

while ((*d++ = *s++));
のようにカッコを追加することで警告を消すことができる、ともありますね。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

返信

“C言語何でも質問掲示板” へ戻る