【解決方法】配列の並べ替えを練習するために、いくつかの文字をアルファベット順に並べ替えようとしています


C++
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
char **StringArray(char **arr, int size);

int main()
{
    char **Str;
    int n= 5;
    int i;
    Str= (char**)calloc(5,sizeof(char));
    Str[0]= (char*) calloc(10, sizeof(char));
    Str[0]= "f";
    for(i=1; i<n; i++)
    {
        Str[i]= (char*) calloc(10, sizeof(char));
        printf("Char %d: ",i);
        scanf("%s", *(Str+i));
    }

    for(i=0; i<=n-1; i++)
        {
            printf("char no.%d: %s\n",i, *(Str+i));
        }

    StringArray(Str, n);

        printf("________________________________\n");

    for(i=0; i<=n-1; i++)
        {
            printf("char no.%d: %s\n",i, *(Str+i));
        }

}

char **StringArray(char **arr, int size)
{
        int i;
        int sorted;
        char *temp=(char*) calloc(10,sizeof(char));

    for(i=0;i<size-1;i++)
    {
        if(strcmp(arr[i],arr[i+1])> 0)
        {
            strcpy(temp,*(arr[i]);
            strcpy(*(arr[i]),*(arr[i+1]));
            strcpy(*(arr[i+1]),temp);
        }

    }

    return arr;

}

私が試したこと:

しかし、Program は、メイン関数でコードを実行するだけでソートされていないものを出力します。

解決策 1

引用:

Str= (char**)calloc(5,sizeof(char));

そうあるべき

C
Str= (char**)calloc(5,sizeof(char *));

他のエラーもあるかもしれません。 とにかく、コードはユーザー入力に対して堅牢ではありません。

解決策 2

おそらくコンパイルされていないためです: StringArray を返すように宣言しますchar** – しかし、関数本体には return 声明。

コードがコンパイルされない場合、EXE ファイルは生成されません。したがって、実行しているのは、コンパイルされた以前のバージョンのコードです。

さらに、関数で動的に割り当てたメモリを解放する必要があります。そうしないと、アプリでメモリ リークが発生します。 また、あなたの見た目が何度も回っているのではないかと思います 0size - 1 しかし、そのサイズを超えて配列の外にある要素にアクセスしようとしました。

strcpy を使用している理由を再考することをお勧めします。これを行うには、ポインターを交換する方がはるかに効率的です。

コメント

タイトルとURLをコピーしました