0

入力された都市名を並べ替えたいのですが、以下のコードは次のようになります。

入力:

ニューヨーク
ジョージタウン
ベルリン

出力:

ベルリン
ゲウィヨーク
ベルジタウン

何故ですか?strcmpと比較してポインタを交換しようと思っていたのですが、うまくいかないようです。

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

void sort(char *dummy);
void swap(char *first, char *second);

int i;
char *names[3];
char *temp;

int main(void) {
    //get the names of the cities
    puts("Enter names of cities");
    for (i = 0; i < 3; i++)
    {
        names[i]=malloc(100);
        fgets( names[i], 99, stdin);
    }

    //print entered names
    for (i = 0; i < 3; i++)
    {
        printf("%s", names[i]);
    }

    sort(names);

    //print sorted names
    for (i = 0; i < 3; i++)
    {
        printf("%s", names[i]);
    }

    getch();
}

//sorting function
void sort(char *dummy)
{
    for (i = 0; i &lt; 2; i++) {
        if (strcmp( &dummy[i], &dummy[i+1]) > 0) {
            swap(&dummy[i], &dummy[i+1]);
        }
    }
}

//swapping function
void swap(char *first, char *second)
{
    temp=second;
    second=first;
    first=temp;
}
4

3 に答える 3

5

swapとして呼び出す場合

swap(&dummy[i], &dummy[i+1]);

address-of 演算子を使用すると、実際には へのポインタへのポインタが作成されますchar。しかし、このswap関数は へのポインターを想定しているため、未定義の動作charでポインターが使用されます。swap

swapポインターからポインターへの引数を引数として持つように関数を変更し、逆参照演算子を使用する*と、より適切に機能するはずです。

void swap(char **first, char **second)
{
    char *tmp = *first;
    *first = *second;
    *second = tmp;
}

もう 1 つの問題は、呼び出し時にもポインターにアドレス演算子を使用することですstrcmp。その場合、それを行うべきではありません。

sortそして 3 番目の問題は、ポインターだけを取る関数にポインターの配列を渡すことですchar。プロトタイプ (および関数) を次のように変更します。

void sort(char *dummy[]);

これがこれらすべての問題でコンパイルされるのは驚くべきことです。エラーではないにしても、少なくとも大量の警告が表示されるはずです。

于 2013-09-19T09:33:39.553 に答える
2

ポインターではなく、文字を交換しています。you 関数のプロトタイプはsort、ほぼ同じ理由で同様に悪いです。

PS:バブル ソートには、1 つだけでなく、2 つのネストされたループが必要です。

学術的な目的で並べ替えを再実装しようとしているのではなく、代わりに並べ替えを完了させたい場合は、qsort代わりに使用する必要があります。

それ以外の場合は、swap 関数を修正してから、sort 関数を修正する必要があります。

于 2013-09-19T09:38:02.730 に答える
1

for1 つではなく 2 つのループが必要ですsort。関数のプロトタイプを変更する必要があります。

GLOBAL SCOPE で宣言したときに関数に名前を渡す必要がないことが 1 つあります。

main 内で *names[3] を宣言する

以下のコードを使用します。

my_sort(names);
//function call 

//defination     
void my_sort(char *dummy[]){
int i,j;
char temp[100];
for (i = 0; i < 2; i++)
for(j=i+1;j<3;j++)
     {
       if (strcmp(dummy[i],dummy[j]) >0)
         {
         strcpy(temp,dummy[i]);
         strcpy(dummy[i],dummy[j]);
         strcpy(dummy[j],temp);
         }
     }
}

また

void my_sort(char *dummy[])
{
int i,j;
for (i = 0; i < 2; i++)
    for(j=i+1;j< 3;j++)
      if (strcmp(dummy[i],dummy[j]) >0)
          swap(&dummy[i],&dummy[j]);
}



void swap(char **first, char **second)
{
    char *tmp = *first;
    *first = *second;
    *second = tmp;
}
于 2013-09-19T09:38:43.027 に答える