2016-08-24 21 views
-3

でのプログラミング、私はここに与えられたHackerRankの問題を解決した - https://www.hackerrank.com/challenges/bigger-is-greaterセグメンテーションフォールト(コアダンプ)C

プログラム文は以下の通りである:単語を考えると

、別のものを構築するために文字を並べ替えます字句的に元の文章よりも大きいような言葉。可能な回答が複数ある場合は、それらの中で辞書編集的に最も小さいものを見つけます。

あなたが理解していない場合は、リンクをクリックしてください。彼らは例を用いて説明した。

以下のようにプログラムを作成しました。このプログラムでは2次元配列を作成しました。変数tは、行数と数値が確定したことを決定します。

t = 1のようにコードが実行されています。 しかし、ときtが1以上であるか、それは誤りセグメンテーションエラーに

コードを与えるいくつかの大規模な数は以下の通りです:

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

int main() { 

    /* Enter your code here. Read input from STDIN. Print output to STDOUT */ 
    int i,j,n,rot; 
    int t; 
    scanf("%d",&t); 
    char c[t][100]; 
    char temp; 
    for(int i=0;i<t;i++) 
    { 
     scanf(" %s",c[i]); 
    } 
    rot=t; 
    for(int t=0;t<rot;t++) 
    { 
     n = strlen(c[t]); 
     //printf("%d\n",n); 
     for(i=n-1;i>=0;i--) 
     { 
      for(j=i-1;j>=0;j--) 
      { 
       //printf("comparint %c and %c\n",c[t][i],c[t][j]); //FOR DEBUG 
       if(c[t][i]>c[t][j]) goto gotit; 
      } 
     } 
     printf("no answer\n"); 

     continue; 

    gotit: 
     temp = c[t][i]; 
     c[t][i]=c[t][j]; 
     c[t][j]=temp; 
     n = (n-1)-j; 
     //printf("%s\n",c[t]); //FOR DEBUG 
     //printf("%d %d %d\n",i,j,n); //FOR DEBUG 

     for(i=0;i<n-1;i++) 
     { 
      for(int k=0;k<n-1;k++) 
      { 
       // printf("comparint %c and %c\n",c[t][j+k+1],c[t][j+k+2]); 
       if(c[t][j+k+1]>c[t][j+k+2]) 
       { 
        temp = c[t][j+k+1]; 
        c[t][j+k+1]=c[t][j+k+2]; 
        c[t][j+k+2]=temp; 
       } 
      } 
     } 
     printf("%s\n",c[t]); 
    } 

    return 0; 
} 
+1

スタート - あなたのインデントを修正します。 –

+0

私はこの問題を解決できれば、直接Hacker Rankに提出しますが、あなたの代理人になる機会に感謝します。それらのサイトはあなたの能力に関するものです。 –

+0

セグメンテーションフォールトはどのラインで起こっていますか?デバッガでプログラムをステップ実行し、さまざまな手順で文字列の値を調べて、いつ破損したかを調べる必要があります。 – Barmar

答えて

0

t10^5または10万ことができます。 cの配列はc[t][100]なので、そのサイズは100000 * 100(10,000,000)です。おそらく、スタックのオーバーフローが発生しています。

WhozCraigが指摘したように、各ケースの処理は独立しています。したがって、cは、1次元配列:char c[100]とすることができます。 c[t][...]c[...]に変更します。あなたは一つの外側のループを持つように

は、物事を調整します:シンプル

int 
main() 
{ 
    int t; 
    char c[100]; 

    scanf("%d", &t); 

    for (int i = 0; i < t; i++) { 
     scanf(" %s", c); 
     // do all processing for this line ... 
     n = strlen(c); 
    } 

    return 0; 
} 
関連する問題