##1.やりたいこと
qsort
を用いて二次元配列内の文字列をソートしたい。
最初の入力で、入力する文字列の量を指定し、
以降の入力で文字列を入力する。
##2.問題点
以下のソースコードを実行しても、何も表示されない。
デバッガなどを用いて配列を確認してみたところ、
どうもqsort
の引数がおかしくて配列が破壊されているように見える。
##3.ソースコード
C
1#include <stdio.h> 2#include <stdlib.h> 3#include <string.h> 4 5int cmp(const void *a, const void *b){ 6 return strcmp(*(const char**)a, *(const char**)b); 7} 8 9int main(void){ 10 int n; 11 char s[10][10]; 12 13 scanf("%d",&n); 14 15 for(int i=0;i<n;i++){ 16 scanf("%s",s[i]); 17 } 18 19 qsort(s,n,1,cmp); 20 21 for(int i=0;i<n;i++){ 22 printf("%s\n",s[i]); 23 } 24 25 return 0; 26} 27
##4.自分が今分かっていること
- cppreference.comによると、qsortは4つの配列を持つ。
これの説明を用いて、なぜ自分のコード内のqsortをそう記述したのかを書いてみる。
qsort(s,n,1,cmp);
1つめの引数:ソートする配列を指すポインタ
ソートする配列は、自分のソースコードではs[10][10]
であるので、s
とした。
2つめの引数:配列の要素数
配列の要素数(=文字列の個数)は入力したnによって変化するのでn
とする。
3つ目の引数:配列の各要素のバイト単位のサイズ
charは1バイトなので、1
とした。
4つ目の引数:第1引数が第2引数より小さい場合は負の整数値、
第1引数が第2引数より大きい場合は正の整数値、
第1引数が第2引数と等しい場合はゼロを返す比較関数。
intをsortする場合と違って、charでは
cmpforint
1int cmp(const void *a,const void *b){ 2 if(*(int*)a>*(int*)b){return -1;} 3 else if(*(int*)a<*(int*)b){return 1;} 4 else {return 0;} 5}
でなく
cmpforchar
1int cmp(const void *a, const void *b){ 2 return strcmp(*(const char**)a, *(const char**)b); 3}
としなければ動かないらしいため。
(スタックオーバーフロー内の質問より)
引数のどこが間違っているか教えていただけないでしょうか。
##5.実行環境
Windows 10 VSC 1.44.2 GCC6.3.0
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2020/04/26 16:55
2020/04/26 16:59
退会済みユーザー
2020/04/26 17:03
退会済みユーザー
2020/04/27 04:31