2

辞書順で名前に従って文字列をソートしようとしています。

だから私は構造の配列を持っています

typedef struct buff{
    char *name;
} structure;

関連する拡張子を持つファイルの名前をコピーしています。その構造の内容がそのようs[0].name = "picture1.jpg" s[1].name = "DCP003.JPG"に見えるようにします。

私はそれを整理しようとしていますが、それを達成することはできません..私がこれまでに持っているのはこれです。

void sort(structure *s, int counter){

    for (int i = 0; i < counter - 1; i++){
        for (int j = 0; j < counter - 1 - i; j++){

                if (strcmp(s[j].name, s[j+1].name) > 0){

                    structure tmp;

                    tmp = s[j];
                    s[j] = s[j+1];
                    s[j+1] = tmp;

            }
        }
    }

    for (int i = 0; i < counter; i++){
        printf("%d - %s\n", i+1, s[i].name);
    }
}

そして、それは私が望むように動作しません..いくつかのバージョンを試してみましたが、まだうまくいきません..どこで間違いを犯していますか? どんなアドバイスも大歓迎です..

4

2 に答える 2

4

構造体の辞書順で文字列をソートする最良の方法は、QSort (Stdlib.h)(O(nlog(n))) を使用することです。

これはサンプルコードです::

#include <stdio.h>
#include <stdlib.h>
#include <string.h>


struct names
{
    char strvalues[20];
} buff[100];


int main ()
{
    int i;
    strcpy(buff[0].strvalues,"some");
    strcpy(buff[1].strvalues,"example");
    strcpy(buff[2].strvalues,"strings");
    strcpy(buff[3].strvalues,"here");

    qsort (buff, 4, 20, (int(*)(const void*,const void*)) strcmp);


    for(i=0;i<4;++i)
    {
        printf("%s\n",buff[i].strvalues);    
    }

    return 0;
}
于 2012-05-11T20:49:13.577 に答える
2

次のようなものを試してください。

typedef struct buff{
    char *name;
} structure;

structure s[5];

void sort(){
    int sz = sizeof s / sizeof s[0];
    printf("sz=%d\n",sz);
    int done = 0;

    for (int i = 0; i < sz; i++){
          for (int j = i+1; j < sz; j++){

                  if (strcmp(s[i].name, s[j].name) > 0){

                      structure tmp;

                      tmp = s[i];
                      s[i] = s[j];
                      s[j] = tmp;
              }
          }
    }
    for (int i = 0; i < sz; i++){
        printf("%d - %s\n", i+1, s[i].name);
    }
}

int main() {
  s[0].name = "dog";
  s[1].name = "ant";
  s[2].name = "cat";
  s[3].name = "man";
  s[4].name = "bear";
  sort();
  return 0;
}

出力:

---------- Capture Output ----------
> "c:\windows\system32\cmd.exe" /c c:\temp\temp.exe
sz=5
1 - ant
2 - bear
3 - cat
4 - dog
5 - man

> Terminated with exit code 0.
于 2012-05-11T20:10:34.343 に答える