ソートを行う場合は一般的にポインタを使うのが多いですが、ここに書くには長すぎるので、最後に幾つかサイトを示すことにします。
まず
scanf("%s",&namae[i]);
が問題です。namae[i]は2次元配列のうち1次元まで書いたものですから、char *型です。これに&をつけると、char **型になってしまいます。scanfにおいて%sに対応する引数はchar *型ですから、&は必要ありません。
一方で、その2行後の
scanf("%d",tensu[i]);
では&が抜けています。
何故必要なのかという話はポインタを理解してからになりますが、"scanfでは通常&が必要で、%sの時には&が必要ない"というぐらいで覚えてみてください。
ひとまず、書かれているプログラムを直すならば、次のようになります。
#include<stdio.h>
int main(void){
int i,j;
int tensu[10][3];
char namae[10][6];
for(i=0;i<10;i++){
printf("名前の入力>>");
scanf("%5s%*c",namae[i]);
printf("点数の入力>>");
scanf("%d%*c",&tensu[i]);
}
printf("名前 点数\n");
for(j=0;j<10;j++) {
printf("%s ",&namae[j]);
printf("%10d\n",tensu[j]);
}
return 0;
}
ソート部分を考慮すると、名前と得点はひとまとめにしたほうが良いでしょう。構造体の出番です。与えられた問題に対する、私の解答例を示しておきます。なお、名前に改行以外の空白文字が使われても許容するように書いています。なお、名前昇順・得点降順としました。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define NUM 10
struct datas{
char name[32];
int point;
};
int comp(const void *p1,const void *p2){
struct datas n1,n2;
n1=*(struct datas *)p1;
n2=*(struct datas *)p2;
if(n1.point>n2.point) return -1;
else if(n1.point<n2.point) return 1;
else return strcmp(n1.name,n2.name);
}
int main(void){
struct datas person[NUM];
int i,j,k;
for(i=0;i<NUM;i++){
printf("Input name>>>");
scanf("%31[^\n]%*c",person[i].name);
printf("Input point>>>");
scanf("%d%*c",&person[i].point);
}
qsort(person,NUM,sizeof(struct datas),comp);
printf("Name\tPoint\n");
for(i=0;i<NUM;i++) printf("%s\t%d\n",person[i].name,person[i].point);
return 0;
}
多分、文法事項を理解するのが早道であると思います。参考になるサイトを幾つか紹介しますので、見てみてください。
<参考サイト>
上記のソースは、概ねここのテキストを参考に書きました。
https://sites.google.com/site/tatuyanctext/home
昔から有名です。
http://homepage3.nifty.com/mmgames/c_guide/
ここも詳しくわかりやすいです。
http://www.geocities.jp/ky_webid/
お礼
回答ありがとございます