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

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

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

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

ポインタ

ポインタはアドレスを用いてメモリに格納された値を"参照する"変数です。

Q&A

解決済

2回答

1635閲覧

ポインタを用いた値の変更が出来なくて、困っています。

mememe0331

総合スコア55

C

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

ポインタ

ポインタはアドレスを用いてメモリに格納された値を"参照する"変数です。

0グッド

0クリップ

投稿2020/06/08 02:59

編集2020/06/08 06:40

前提・実現したいこと

「入力:」で値x,y,zを入力して、関数の中でx→z、y→x、z→yの値に変更して「出力:」の部分で表示したいです。

発生している問題・エラーメッセージ

【発生している問題】 関数の中の最後のprintfでエラーが出てしまいます。どうすれば、このエラーを解決することができるのか分かりません。 【エラーメッセージ】 kadai5_1.c(26): warning C4477: 'printf' : 書式文字列 '%d' には、型 'int' の引数が必要ですが、可変個引数 1 は型 'int **' です kadai5_1.c(26): warning C4477: 'printf' : 書式文字列 '%d' には、型 'int' の引数が必要ですが、可変個引数 2 は型 'int **' です kadai5_1.c(26): warning C4477: 'printf' : 書式文字列 '%d' には、型 'int' の引数が必要ですが、可変個引数 3 は型 'int **' です

該当のソースコード

C言語

1#include <stdio.h> 2 3void rotate(int *x,int *y,int *z); 4 5int main(void) 6{ 7 int x,y,z; 8 9 printf("3つの整数を入力してください(1マスずつ開けて入力):"); 10 scanf("&d %d %d",&x, &y, &z); 11 12 rotate(&x,&y,&z); 13 14 return 0; 15} 16 17void rotate(int *x,int *y,int *z) 18{ 19 int tmp1=*x; 20 int tmp2=*y; 21 22 *x = *z; 23 *y = tmp1; 24 *z = tmp2; 25 26 printf("出力:%d %d %d",&x, &y, &z); 27 28 29}

試したこと

%pに変更するとアドレスが表示されるので、代入した値が表示されません。
&*xにすると、さらにエラーメッセージが表示されました。

補足情報(FW/ツールのバージョンなど)

サクラエディタ、Windows10を使用しています。

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

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

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

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

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

YT0014

2020/06/08 03:57

C言語の質問なので、タグに「C」を追加してください。 また、サクラエディタとは無関係なので、タグから除外してください。 個人的には、関数も不要だと思います。
mememe0331

2020/06/08 06:40

変更致しました。ご指摘ありがとうございます。
guest

回答2

0

ベストアンサー

2つの部分で間違えています。

  • scanf("&d %d %d",&x, &y, &z);で、書式制御文字列の一部が&dになっています。scanf("%d %d %d",&x, &y, &z);でしょう。
  • printf("出力:%d %d %d",&x, &y, &z);は、ポインタ変数x, y, zの指し示す値を表示したいわけですから、
    printf("出力:%d %d %d\n", *x, *y, *z); です。

投稿2020/06/08 03:21

dodox86

総合スコア9256

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

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

dodox86

2020/06/08 03:22

投稿した後に気が付きましたが、printfでの修正案のおしりの"\n"は私が確認のときにつけてしまったものです。お好きなように修正してください。
mememe0331

2020/06/08 03:29

丁寧にご回答頂き、ありがとうございます! おかげさまで、コンパイルすることができました。 しかし実行してみると、 3つの整数を入力してください(1マスずつ開けて入力):1 2 3 出力:12070912 4527089 4527089 出力された数がおかしくなってしまいました。 お手数ですが、この点についても教えていただくことは可能でしょうか?
dodox86

2020/06/08 03:37

こちらで確認したとき(Windows 10/WSL Ubuntu上)はOKでしたが。scanfの部分もちゃんと修正しましたか? 実行環境は何でしょうか。
dodox86

2020/06/08 03:51

実行環境とは、コンパイラを含む実行時のターミナルなどのこと、です。Visual Studo 2019でコンパイルして、コマンドプロンプトで実行しているとか、Visual Studio Codeでgccで何かのターミナルとか、PowerShell、とか。
mememe0331

2020/06/08 06:47

遅くなってしまい申し訳ありません。 環境のことを教えて頂いてありがとうございます。 command prompt for VS 2019でコンパイルして、実行しました。
dodox86

2020/06/08 07:17

> command prompt for VS 2019でコンパイルして、実行しました。 こちらでほぼ同じ環境で試しましたが、問題ありませんでした。念のため、ソースコードのファイルエンコードをシフトJIS,UTF-8のどちらも、更に、 C言語ソースファイルの拡張子を *.cppと *.c の両方で試しましたが、問題なく動作します。 Visual Studio Community 2019 (ver.16.6.1 現時点最新)で、「Developer Command Prompt for VS2019」での実行結果を示しますので、質問者さんのコードと比べてみてください。 >>>ここから C:\projects\teratail\268452\ConApp1>type ConApp1.cpp #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> void rotate(int* x, int* y, int* z); int main(void) { int x, y, z; printf("3つの整数を入力してください(1マスずつ開けて入力):"); // NG1 scanf("&d %d %d",&x, &y, &z); scanf("%d %d %d", &x, &y, &z); rotate(&x, &y, &z); return 0; } void rotate(int* x, int* y, int* z) { int tmp1 = *x; int tmp2 = *y; *x = *z; *y = tmp1; *z = tmp2; //NG2: printf("出力:%d %d %d",&x, &y, &z); printf("出力:%d %d %d\n", *x, *y, *z); } C:\projects\teratail\268452\ConApp1>devenv /build release ConApp1.sln Microsoft Visual Studio 2019 RC バージョン 16.6.1。 Copyright (C) Microsoft Corp. All rights reserved. 1>------ ビルド開始: プロジェクト: ConApp1, 構成: Release Win32 ------ 1>ConApp1.cpp 1>コード生成しています。 1>Previous IPDB not found, fall back to full compilation. 1>All 8 functions were compiled because no usable IPDB/IOBJ from previous compilation was found. 1>コード生成が終了しました。 1>ConApp1.vcxproj -> C:\projects\teratail\268452\ConApp1\Release\ConApp1.exe ========== ビルド: 1 正常終了、0 失敗、0 更新不要、0 スキップ ========== C:\projects\teratail\268452\ConApp1>Release\ConApp1.exe 3つの整数を入力してください(1マスずつ開けて入力):1 2 3 出力:3 1 2 C:\projects\teratail\268452\ConApp1> <<<ここまで
dodox86

2020/06/08 07:27

サクラエディタを使っていて、修正後にちゃんと保存していなかったとか、別のディレクトリに保存していたとか、Visual Studio でも開いていて、保存が競合してリロードしてしまったとか。コマンドプロンプト上でコンパイル~ビルドするときに正しいソースか再度確認してみてください。
mememe0331

2020/06/09 07:51

すごく丁寧にありがとうございました。 何とか出来ました。 本当にありがとうございます!!!
guest

0

問題の意図からすると、rotate()の内部では値の交換のみ行ない、main()に戻ってきてからprintfするほうが望ましいように見えますが、「rotateの内部で出力を行なえ」みたいな指示が(われわれには見えないどこかで)あるのでしょうか。
main()でprintfを使うなら、main内のローカル変数x, y, zを出力するだけなので、質問者にも問題なく書けるかと思います。

投稿2020/06/08 04:07

編集2020/06/08 04:08
Daregada

総合スコア11990

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

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

mememe0331

2020/06/09 08:00

回答ありがとうございます。 すみません。説明不足でした。 rotateの内部で出力を行う必要があります。
Daregada

2020/06/09 08:08 編集

なぜでしょう。rotateの担う役割と最終結果の出力には乖離がありますね。 ええと、今回のプログラムの(明示されていない)目的は、「main関数内のローカル変数の値を、別の関数で交換(ローテート)させ、最終的にmain関数内のローカル変数の値自体にそれを反映させる」ことです。 そうでなければ、わざわざ「ポインタをrotateに渡す」意味がない→普通に値渡しして、rotate内で交換した値を出力すればいいことになってしまう。 ですから、最終的な出力はmain関数内のほうが、問題を作る側からみると「ふさわしい」のです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問