71398


> 配列の 0 番⽬が “elephant”、1 番⽬が“giraffe”、2 番⽬が“crocodile”、3 番⽬が“panda”、4
> 番⽬が“chimpanzee” となるように宣⾔をし、ポインタ配列 sortP の中に ASCII コードで降順に並び替えて値を格納して、sortP
> の結果を表⽰させなさい。

という問題ですが、下記のように書いてtimeoutになってしまいます。  
どこがわるいのでしょうか？sortの中身だとは思いますが…

[code]

    #include <stdio.h>
    
    char compare(char c1, char c2)
    {
        return (c1 - c2);
    }
    
    void sort_rev(char **array)
    {
        int i, j, k;
        char *temp;
    
        i = 0;
        while (i < 4)
        {
            j = 0;
            while (++j < 5)
            {
                k = 0;
                while (array[i][k] != '\0' && array[j][k] != '\0')
                {
                    if  (compare(array[i][k], array[j][k]) == 0)
                    {
                        k++;
                    }
                    else if (compare(array[i][k], array[j][k]) < 0)
                    {
                        temp = array[i];
                        array[i] = array[j];
                        array[j] = temp;
                    }
    
                }
            }
            i++;
        }
        return ;
    }
    
    int main(void){
        // Your code here!
        char *sortP[255] = {
            "elephant", "giraffe", "crocodile", "panda", "chimpanzee"
        };
    
        for(int i = 0; i < 5; i++)
        {
            printf("inside sortP before sorth: %s\n", *(sortP + i));
        }
        sort_rev(sortP);
        for(int i = 0; i < 5; i++)
        {
            printf("answer: %s\n", *(sortP + i));
        }
    }
    
[/code]


CC BY-SA 4.0
2020-10-21T15:45:40.413
71394
2020-10-22T00:12:42.657
2020-10-22T00:12:42.657
3060
36091
question
c
ソートがタイムアウトしてしまう


`array[0]`（`i`=0）が参照元の場合、`j`が1から4までループします。  
あと、`array[1]`（`i`=1）を参照元にした後、`j`は1ではなく、2から4までループします。

[code]

        while (i < 4)
        {
            j = i;  // j = 0;  //　変更
            while (++j < 5)
    
[/code]

* * *

文字列を比較する時、交換するか、しないかが決まったら、`k`のループをbreakします。

[code]

                    else if (compare(array[i][k], array[j][k]) < 0)
                    {
                        temp = array[i];
                        array[i] = array[j];
                        array[j] = temp;
    　　　　　　　　　　　break;  //  追加
                    }
                    //  以下のelseを追加
                    else
                    {
                        break;
                    }
    
[/code]


CC BY-SA 4.0
2020-10-21T16:41:18.507
71396
2020-10-21T16:41:18.507
41425
71394
answer


本題とは無関係ですが、ソースコードのあちこちに `4` とか `5`
といった即値が散りばめられているのはちょっと…と思うので(書き間違えると大変)、`char *` 型の配列 `sortP`
の要素数を予め計算しておいて、`sort_rev` 関数に渡す様にするとよろしいのではないかと思います。参考までに実装例を挙げておきます。

[code]

    #include <stdio.h>
    
    // swap two variables
    #define swap(a, b) { __typeof__(a) temp = a; a = b; b = temp; }
    
    // prototype declaration
    void sort_rev(const char *array[], const int len);
    
    // sort in reverse order
    void sort_rev(const char *array[], const int len) {
      for(int i=0;i<(len-1);i++){
        for(int j=i+1,k=0;j<len;j++,k=0) {
          while(array[i][k] != '\0' && array[j][k] != '\0') {
            char diff = array[i][k] - array[j][k];
            if (diff == 0) { k++; continue; }
            if (diff < 0)  { swap(array[i], array[j]); }
            break;
          }
        }
      }
      return;
    }
    
    // main routine
    int main() {
      const char *sortP[] = {
        "elephant", "giraffe", "crocodile", "panda", "chimpanzee"
      };
      const int l = sizeof(sortP)/sizeof(char *);
    
      for(int i=0;i<l;i++){
        printf("inside sortP before sort: %s\n", sortP[i]);
      }
    
      sort_rev(sortP, l);
    
      for(int i=0;i<l;i++){
        printf("answer: %s\n", sortP[i]);
      }
    
      return 0;
    }
    
[/code]


CC BY-SA 4.0
2020-10-21T18:57:33.307
71398
2020-10-21T18:57:33.307
71394
answer