プロが教える店舗&オフィスのセキュリティ対策術

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;
}

A 回答 (4件)

> 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);
    • good
    • 0

> …は、同じところを指します。


> ただし、それぞれの型が違います。

No.2の回答者です,ご指摘ありがとうございます,勉強になりました。
    • good
    • 0

修正内容は既に回答にあるとおりです。


(この場合は、修正しなくても動作しますが)

ただ、

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] という型が渡されてる」ということが書かれています。
    • good
    • 0

>printf("名前: "); scanf("%s", &namae);



scanfで%sの時に渡す引数は「変数の先頭要素のアドレス」または「配列名」です。
配列の場合、配列名=先頭要素のアドレスです。なので、
>&namae
だと「先頭要素のアドレスを格納しているポインタのアドレス」になってしまいます。
ですから、
>printf("名前: "); scanf("%s", namae);
または
>printf("名前: "); scanf("%s", &(namae[0]));
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!