

5人の名前と身長を入力し、1番高い人の名前と身長を表示せよというものです。
下記のソースプログラムをコンパイルすると
warning: format ‘%s’ expects type ‘char *’, but argument 2 has type ‘char (*)[10]’
と表示されます。どこを修正すればよいのでしょうか?
またこのプログラムにはchar関数を使っていますが、char関数というのも良く分かりません
その解説も付け加えていただけると幸いです#include <stdio.h>
#include <string.h>
int main(void)
{
int i,sincho,max_sincho;
char max_namae[10],namae[10];
max_sincho=0;
for(i=1;i<=5;i++){
printf("名前: "); scanf("%s", &namae);
printf("身長: "); scanf("%d", &sincho);
if(sincho>max_sincho){
max_sincho=sincho;
strcpy(max_namae,namae);
}
}
printf("身長が一番高い人は%sさんで%d cmです。\n", max_namae,max_sincho);
return 0;
}
No.2ベストアンサー
- 回答日時:
> char関数を使っていますが
「char max_namae[10], namae[10];」という行のことを指しておいでなら,char関数ではなく,char(文字)データ型です。1文字を10個並べた文字配列が2つ定義されており,max_namae と namae という変数名はそれぞれの先頭番地を指しているということです。
max_namae
↓
↓[0] [1] [2] [3] [4] [5] [6] [7] [8] [9]
+―+―+―+―+―+―+―+―+―+―+
| | | | | | | | | | |
+―+―+―+―+―+―+―+―+―+―+
namae
↓
↓[0] [1] [2] [3] [4] [5] [6] [7] [8] [9]
+―+―+―+―+―+―+―+―+―+―+
| | | | | | | | | | |
+―+―+―+―+―+―+―+―+―+―+
> どこを修正すればよいのでしょうか?
回答No.1で解説されているとおり,入力した「名前」文字列を namae が指す番地以降に格納したいわけですから,こうなります。
誤× printf("名前: "); scanf("%s", &namae);
正○ printf("名前: "); scanf("%s", namae);

No.3
- 回答日時:
修正内容は既に回答にあるとおりです。
(この場合は、修正しなくても動作しますが)
ただ、
char name[10];
に対して、 &name は、「name の先頭アドレス」を返します。
これは、Cの規格で定まっている、「配列名が配列の先頭アドレスに読み替えられない例外」のひとつで、
&name[0];
name; (アドレスに読み替えられた場合)
&name;
は、同じところを指します。
ただし、それぞれの型が違います。
&name[0]; の型は、 char * (char へのポインタ)です。
name の型は、 char * に読み替えられます。
&name; は、char [10] という「char 10個の要素からなる配列」という型へのポインタです。
(つまり、 char (*)[10])
実際に警告は、「%s は、対応する引数が char * であることを期待しているが、実際には、 char (*)[10] という型が渡されてる」ということが書かれています。
No.1
- 回答日時:
>printf("名前: "); scanf("%s", &namae);
scanfで%sの時に渡す引数は「変数の先頭要素のアドレス」または「配列名」です。
配列の場合、配列名=先頭要素のアドレスです。なので、
>&namae
だと「先頭要素のアドレスを格納しているポインタのアドレス」になってしまいます。
ですから、
>printf("名前: "); scanf("%s", namae);
または
>printf("名前: "); scanf("%s", &(namae[0]));
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C言語 プログラミング 4 2022/05/22 11:53
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- C言語・C++・C# c言語でユーザ関数を利用して入力された文字列を反転させるプログラムを作りたいです。 3 2023/01/29 19:47
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- C言語・C++・C# c言語配列の結合についてです。 なぜうまくいかないのでしょうか。 #include <stdio.h 4 2022/05/30 22:42
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# const char** p;のとき、free(p)でC4090エラーとなるのはなぜですか 3 2023/03/31 16:28
- C言語・C++・C# Cのdoubleの浮動小数点表示について 3 2023/04/17 13:14
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# プログラミング c言語 4 2023/03/07 01:05
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
CStringからchar*への型変換に...
-
C言語のintとcharの違いってな...
-
入力された文字列の中の数字を...
-
C++17で、unsigned char * 配列...
-
char*を初期化したいのですが
-
char型について【初心者です】
-
C言語のプログラムについてです
-
文字列str内の全ての数字を...
-
C言語にて構造体のメンバがNULL...
-
VC++ char[10]へのCString値の代入
-
c言語でポインタ変数を用いた配...
-
ポインタで詰まりました;
-
const char* s1とただのchar s1...
-
小数点入りの文字列をfloat型に...
-
char型にint型の数値を代入する。
-
char 文字列型 の表現範囲が-12...
-
C言語:小文字を大文字に変換す...
-
コマンドライン引数 *argv[]は...
-
[C] 構造体メンバーのカンマ区...
-
コマンドライン引数
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
CStringからchar*への型変換に...
-
char*を初期化したいのですが
-
C言語のintとcharの違いってな...
-
char型にint型の数値を代入する。
-
C言語にて構造体のメンバがNULL...
-
fgetc( )の戻り値はなぜ整数??
-
char 文字列型 の表現範囲が-12...
-
fstream型オブジェクトを関数の...
-
C++17で、unsigned char * 配列...
-
DWORDとcharの変換
-
文字列内の数字削除
-
new charとnew char[N]の違いは?
-
文字型配列に格納した空白の切捨て
-
C++Builder 2009 テキスト...
-
csvファイルをfscanfで読み込む...
-
文字列の途中から途中までを抽出
-
[C] 構造体メンバーのカンマ区...
-
エクセルのMID関数は、C言語では?
-
小数点入りの文字列をfloat型に...
-
wsprintf( ポインタ , "%d" , "...
おすすめ情報