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

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

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

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

解決済

2回答

424閲覧

ソートプログラムをつくているのですが挙動が想定外で困っています。

brongzong

総合スコア13

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

0クリップ

投稿2018/11/12 05:00

編集2018/11/12 05:41

構造体に値や名前を入力してそれを入力した値を基準に降順でソートをしたいです。

・エラーメッセージ
sorttest.c: In function ‘main’:
sorttest.c:48:15: warning: unknown conversion type character ‘-’ in format [-Wformat=]
scanf("%-10.10s" , &x[i].name);
^
sorttest.c:48:15: warning: too many arguments for format [-Wformat-extra-args]

・ソースファイル

/* qsort関数を用いて配列をソート */ #include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct { char name[10]; /* 名前 */ int score; /* 得点 */ } player; /*--- person型オブジェクトの比較関数 ---*/ int wdcmp(const player *x, const player *y) { return (x->score < y->score ? 1 : x->score < y->score ? -1 : 0);/* 降順 */ } /*--- 一人分のデータを表示 ---*/ void print_player(player x) { printf("%-10.10s %dPoint\n", x.name, x.score); } /* 一人分の名前を表示 */ void print_name(player x) { printf("%-10.10s", x.name); } /* 一人分のスコアを表示 */ void print_score(player x) { printf("%dpoint\n",x.score); } int main(void) { int i; int a = 1; player x[3]; for(i = 0;i < 4; i++) { printf("名前を入力してください\n"); scanf("%-10.10s" , &x[i].name); printf("スコアを入力してください\n"); scanf("%d\n", &x[i].score); }; puts("ソート前"); for (i = 0; i < 4; i++) print_player(x[i]); /* 得点降順にソート */ qsort(x, 4, sizeof(player), (int(*)(const void*, const void*))wdcmp); puts("\n得点降順ソート後"); for (i = 0; i < 4; i++) { printf("%d ", a); print_name(x[i]); print_score(x[i]); a++; } return (0); }

構造体に予めデータを入れていたときは問題なく動作していたのですがデータを入力式にしたところ
名前を入力してください
kori
スコアを入力してください
名前を入力してください
スコアを入力してください
名前を入力してください
スコアを入力してください
名前を入力してください
スコアを入力してください
ソート前
 0Point
0Point
@ 0Point
V�� 1046003606Point

得点降順ソート後
1 V�� 1046003606point
2  0point
3 0point
4 @ 0point
上記のようになってしまい、for文が機能はしているのですがscanfが機能していないです。原因も改善点もわからないのでアドバイスお願いします。

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

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

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

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

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

y_waiwai

2018/11/12 05:07

C#じゃなくてC言語ですね。また、コードが見にくいので、質門を編集して、<code>ボタンで、’’’の枠の中にコードを貼り付けてください
runny_nose

2018/11/12 05:07

タグがC#になっているので、Cにしたほうがいいのではないでしょうか
brongzong

2018/11/12 05:20

ありがとうございます修正します。
guest

回答2

0

それ以外のところを指摘しておきます

player x[3];

for(i = 0;i < 4; i++) { printf("名前を入力してください\n"); scanf("%-10.10s" , &x[i].name); printf("スコアを入力してください\n"); scanf("%d\n", &x[i].score); };

x[3] で変数定義すると、x[0]から、x[2]までの配列となります

for(i = 0;i < 4; i++)

とするなら、xの定義は
player x[4];
とする必要があります
また、
x[i].name の定義は

char name[10]; /* 名前 */

ですが、文字列を格納しようとする場合、文字列終端の'\0'を考慮に入れる必要があります
10文字いれる必要があるなら、ここは11文字以上、
char name[12]; /* 名前 */
程度にしておきましょう

また、

scanf("%-10.10s" , &x[i].name);

は、
scanf("%10s" , x[i].name);
が正しいです

投稿2018/11/12 05:56

編集2018/11/12 05:58
y_waiwai

総合スコア87774

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

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

brongzong

2018/11/16 04:53

ありがとうございます。 丁寧な解説で細部まで修正することができました。
guest

0

ベストアンサー

c

1player x[3]; 2 3for(i = 0;i < 4; i++) 4{ 5printf("名前を入力してください\n"); 6scanf("%-10.10s" , &x[i].name); 7printf("スコアを入力してください\n"); 8scanf("%d\n", &x[i].score); 9};

C

1player x[4]; 2 3for(i = 0;i < 4; i++) 4{ 5printf("名前を入力してください\n"); 6scanf("%10s" , &x[i].name); 7printf("スコアを入力してください\n"); 8scanf("%d", &x[i].score); 9}

scanfのフォーマット文字列とprintfのフォーマット文字列は微妙に違うので注意しましょう

投稿2018/11/12 05:19

編集2018/11/12 05:22
asm

総合スコア15147

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

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

brongzong

2018/11/12 05:26

ありがとうございました。無事に解決しました。 フォーマット文字列のあたりは曖昧だったのでもう一度復讐したいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問