2017-12-23 8 views
0

後に終了し、実行に失敗しましたと言うと言いますが、動的なメモリ割り当てを使用する必要がコードは、第二のprintfにコード出口を印刷した後、入出力文

void main() 
{ 
    int testcases; 
    int n_lines ,m_length; 
    int test, lines, length; 
    char n_m_matrix[n_lines][m_length]; 
    printf("Enter the no. of Test Cases "); 
    scanf("%d",&testcases); 
    printf("%d",testcases); 
    for(test=0;test>testcases;test++) 
    { 
     printf("Enter the lines and length of the test cases "); 
     scanf("%d%d",&n_lines,&m_length); 
     for(lines=0;lines<n_lines;lines++) 
     { 
      for(length=0;length<m_length;length++) 
      { 
       scanf("%c",&n_m_matrix[lines][length]); 
      } 
     } 
    } 

} 
+1

'void main()'の代わりに 'int main()'を使います。それは*古代*です。 – iBug

+4

'test

答えて

0

(入力されたものは何でも)レベル2で終了、malloc方法。マトリクスn_m_matrixは、ユーザの入力に基づいて動的に決定されます。

  1. ループ
    printf("Enter the lines and length of the test cases "); scanf("%d%d",&n_lines,&m_length);
+1

あなたは 'malloc'を使う必要はありません。変数を設定した後に配列を宣言するだけです。 – Barmar

+0

@Barmar 'n_lines'と' m_length'の値は動的に(ユーザーの入力に基づいて)変更されるので、静的なメモリ割り当てはできません。 [このQAを参照してください](https://stackoverflow.com/questions/2128728/allocate-matrix-in-c) – Raviprakash

+0

配列の宣言を 'for'ループ内に移動するだけで、入力の後ろに置くことができます。 – Barmar

2

のための外のコードの下に入れてtest<testcase

  • にループ正しい論理エラーtest>testcaseのためにあなたはの宣言を移動する必要があるのmalloc
  • を使用してn_m_matrixにメモリを割り当てn_m_matrixをループに挿入して、寸法を保持する変数を入力した後にします。

    他にも触れたように、test > testcasesの入力ミスは<です。

    改行を読み取るには、ディメンションを入力した後に余分な文字を読み取る必要があります。それ以外の場合は、入力バッファ内の寸法の後に改行を残します。これは、内容を読むときに最初の%c入力として読み取られます。

    また、文字ごとに行う代わりに、fgets()を使用して各行を読むことを検討することもできます。あなたがそれを書いたやり方で、各行の最後に改行があれば、配列に挿入されます。それが必要かどうかは明らかではありません。そうであれば、それらを行の長さの入力に含めてください。 serveral問題VLAのサイズとして初期化されていない変数を使用して、コード内の未定義の振る舞いをされて起動する最初のものの間で混乱をクリアするには

    int main() 
    { 
        int testcases; 
        int n_lines ,m_length; 
        int test, lines, length; 
        printf("Enter the no. of Test Cases "); 
        scanf("%d",&testcases); 
        printf("%d\n",testcases); 
        for(test=0; test < testcases; test++) 
        { 
         printf("Enter the lines and length of the test cases "); 
         scanf("%d%d",&n_lines,&m_length); 
         getc(); // Skip over the newline 
         char n_m_matrix[n_lines][m_length]; 
         for(lines=0;lines<n_lines;lines++) 
         { 
          for(length=0;length<m_length;length++) 
          { 
           scanf("%c",&n_m_matrix[lines][length]); 
          } 
         } 
        } 
    
    } 
    
  • +1

    '%d%d'の後の空白は、[入力がファイルから来た場合](https://stackoverflow.com/questions/19499060/)ですが、入力された場合は無効です。また、一番内側のループのペアは、配列に格納するための有効な文字として改行を扱います。これはOKかもしれません。 –

    +0

    @JonathanLefflerありがとう、私は何かが間違っていたと感じました。残りの入力に改行について何かを追加しました。 – Barmar

    2

    また、ループロジックが間違っていて、文字入力が処理上の問題を引き起こす可能性があります。 (\nと入力した場合)。

    正しいコードは、配列に入力された空白文字を必要としないことを考慮すると、fgetsなどの他のより良い選択肢があります。

    #include<stdio.h> 
    #include<stdlib.h> 
    #define MAXSIZE 1024 
    int main(void) 
    { 
        int testcases; 
        int n_lines ,m_length; 
        int test, lines, length; 
    
        printf("Enter the no. of Test Cases "); 
        if(scanf("%d",&testcases) != 1){ 
         fprintf(stderr, "%s\n","Error in input"); 
         exit(1); 
        } 
        if(testcases <= 0){ 
         fprintf(stderr,"%s\n","Enter nonzero integer for testcases"); 
         exit(1); 
        } 
        printf("%d",testcases); 
        for(test = 0; test < testcases; test++) 
        { 
         printf("Enter the lines and length of the test cases "); 
         if(scanf("%d%d",&n_lines,&m_length)!=1){ 
          fprintf(stderr, "%s\n","Error in input"); 
          exit(1);   
         } 
         if(n_lines <= 0 || m_length <= 0 || !(n_lines <= MAXSIZE && m_length <= MAXSIZE)){ 
          fprintf(stderr, "%s\n","Error in input n_lines and m_length"); 
          exit(1);   
         } 
    
         char n_m_matrix[n_lines][m_length]; 
         for(lines = 0; lines < n_lines; lines++) 
         { 
          for(length = 0; length < m_length; length++) 
          { 
           if(scanf(" %c",&n_m_matrix[lines][length]) != 1) 
           { 
            fprintf(stderr, "%s\n","Eror in input"); 
            exit(1); 
           } 
    
          } 
         } 
         // work with VLA here. 
        } 
        return 0; 
    } 
    

    これよりもはるかに大きなアレイサイズが必要な場合は、ダイナミックメモリの割り当てに使用します。それはアレイでのより大きなメモリ要件を満たすでしょう。

    +0

    問題の領域を理解する以外に、限界を判断する良い方法はありません。しかし、あなたはVLAのサイズを制限する必要があります。そうしないと、回復のチャンスがなくなります。その時点で、動的メモリ割り当てが有効になります。 –

    +0

    @JonathanLeffler .:私はそうだと思います。ダイナミックメモリの割り当てが役に立ちます。 – coderredoc

    関連する問題