参考問題を書きかえて、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));
よろしくお願いいたします。
新・明解 C言語 演習11-3を解けなくて困っています。
Re: 新・明解 C言語 演習11-3を解けなくて困っています。
東上☆海美☆「
載ってたリストに、ちょっと手を加えて、ビルドしてみましたが、
出力は
別に問題は、ないみみ。
> 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 に、& が、ついてるみみ。
警告やノートの方は、
昔のコードに対して、
今の規格だと「何が起こるかわからない」けど、
今、昔の解釈でコンパイルできないと、困りますから、昔風の解釈で通しますが、
将来は保証しませんよ、
ぐらいみみ ?
」
載ってたリストに、ちょっと手を加えて、ビルドしてみましたが、
//
// 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, 電子ブロック 持ち。
東上☆海美☆(とうじょう・うみみ)
http://atassyu.php.xdomain.jp/vtuber/index.html
レスがついていないものを優先して、レスするみみ。時々、見当外れなレスしみみ。
中の人:
手提鞄あたッしュ、[MrAtassyu] 手提鞄屋魚有店
http://ameblo.jp/mratassyu/
Pixiv: 666303
Windows, Mac, Linux, Haiku, Raspbery Pi, Jetson Nano, 電子ブロック 持ち。
Re: 新・明解 C言語 演習11-3を解けなくて困っています。
Bullsさんへ
ソースコードを提示する際は、BBCodeが有効な(無効にしない)状態で、
BBCodeのcodeタグの開始タグと終了タグの組(開始タグが先)で囲んでいただけると、
見やすくてありがたいです。
という意味ですね。
「いやここは代入で合ってる!」という場合は、 のようにカッコを追加することで警告を消すことができる、ともありますね。
ソースコードを提示する際は、BBCodeが有効な(無効にしない)状態で、
BBCodeのcodeタグの開始タグと終了タグの組(開始タグが先)で囲んでいただけると、
見やすくてありがたいです。
「ループの中で代入をするというのは不自然だ。本当は比較をしたいんじゃないの?」
という意味ですね。
「いやここは代入で合ってる!」という場合は、 のようにカッコを追加することで警告を消すことができる、ともありますね。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)