2016-08-14 6 views
1

2つの配列を作成したい、1つは文字配列、もう1つは整数配列です。両方とも、ユーザが整数要素の数について入力を提供するときに動的に作成されます。すべての整数はスペースで区切られます。入力がスペースで区切られた整数の場合、動的に作成された文字配列を整数配列に変換する方法

入力:

最初の行はNで構成されて、ここでN整数の数です。ユーザーが5を入力すると、次の行にはスペースで区切られたNの整数が含まれます。すなわち5つの整数5 10 23 456 2

出力:

int_array[i], int_array[i+1] .... 5,10すなわち整数配列から要素を表示します

出力...

しかし、私は私のコードを試みたとき、私が見ることができる唯一の0の整数配列から。

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

int *cstois(char *char_array, int *int_array, int n) { 
    int i, j; 
    for (i = 0, j = 0; i < n; i++) { 
     if (char_array[i] >= '0' && char_array[i] <= '9') { 
      int_array[j] == int_array[j] * 10 + (char_array[i] - '0'); 
     } else 
     if (char_array[i] == ' ') { 
      j++; 
     } else 
      continue; 
    } 
    return int_array; 
} 

int main() { 
    int i, n; 
    printf("enter no. of elements"); 
    scanf("%d\n", &n); 
    char *char_array; 
    char_array = (char*)malloc(n * sizeof(int)); 
    fgets(char_array, sizeof(char_array), stdin); 
    int *int_array = (int*)calloc(n, sizeof(int)); 
    cstois(&char_array[0], &int_array[0], n); 
    for (i = 0; i < n; i++) 
     printf("%d\n", int_array[i]); 
    free(char_array); 
    free(int_array); 
    return 0; 
} 
+0

整数を含むファイルをお持ちの場合は、最初にそれらをテキストとして読んでください。なぜ使わないの?ループ中の 'fscanf'? –

+0

'int_array [j] == int_array [j] * ...' ??比較は意図していない?ああコピー/ペースト、あなたは無慈悲な賢者です。これを修正しても、 'var = var * anything'は' var'が最初は0(これは 'calloc'の後ろ)であるときに決して大したものにならないので、まだ動作していないことがわかります。それは注意が必要なデザイン上の欠陥です。 – WhozCraig

+0

申し訳ありませんが、1つの '='私はそれを間違って入力しました。 –

答えて

0

あなたのコード内の複数の問題があります:

  • は、標準的なヘッダ<malloc.h>はありません。ここ

    コードがあります。 malloc()は、<stdlib.h>で定義されています。

  • 機能cstois()に、あなたは正しくので、タイプミスの数を更新しない:int_array[j] == int_array[j] * 10 + (char_array[i] - '0');int_array[j] = int_array[j] * 10 + (char_array[i] - '0');

  • する必要がありますあなたは数字やスペース文字でないすべての文字を無視します。これは必ずしも正しいとは限りません。1,2,3は、エラーとして報告される代わりに123と解析されます。

  • 入力バッファーをスキャンすると、さらに悪いことに、'\0'をチェックしません。ユーザーから読み取られた行に十分な数がない場合は、文字列の終わりを潜在的に調べて、配列の終わりを超えてしまう可能性があり、未定義の動作が呼び出されます。

  • スペース文字の次の要素にスキップします。数字を複数のスペースで区切ると、数字が間違ってスキップされます。

  • 負の数値は処理できません。

  • ファンクションmain()の場合、入力配列はchar_array = (char*)malloc(n * sizeof(int));と割り当てられます。 32ビット整数の平均桁数を3に制限するので、これは間違っています...大きな整数を使用できるようにするには、数字ごとに少なくとも20桁を割り当てる必要があります。

  • fgets()でユーザーから読み取られた行は、悲劇的に短いです。sizeof(char_array)は、配列に割り当てられたサイズではなく、ポインタのサイズです。そのサイズを変数に保存し、malloc()fgets()の両方に渡します。

  • scanf()の戻り値、fgets()またはmalloc()の戻り値はチェックしないでください。空のファイルは正しく処理されません。

複数のスペースセパレータと負の数を処理するための簡単な方法は、使用することですstrtol()

int *cstois(char *char_array, int *int_array, int n) { 
    for (int i = 0; i < n; i++) { 
     int_array[i] = strtol(char_array, &char_array, 10); 
    } 
    return int_array; 
} 

この単純な実装では、最初の非数で停止し、0int_arrayに残りのすべての項目を記入します。数が足りないと、同様に配列内にゼロ値が返されます。

+0

非常にチャーリーありがとう、私はあなたが私にここに示したすべての問題を解決しようとしています。 –

+0

この回答を受け入れるには、回答スコアの下のグレーのチェックマークをクリックします。 – chqrlie

+0

thanx charlieもう一度、私はプログラムをやって、私はそれも複数のスペースと負の値を処理するために最適化するつもりです。 –

0

入力後に文字列を印刷しましたが、スペースがなくなるまで値があることがわかりました。私はfgetsで作るべき修正帽子があります。ここに変更されたコードがあります。

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

int *cstois(char *char_array, int *int_array, int n) { 
    int i, j; 
    for (i = 0, j = 0; i < n; i++) { 
     if (char_array[i] >= '0' && char_array[i] <= '9') { 
      int_array[j] = (int_array[j] * 10) + (char_array[i] - '0'); 
     } else 
     if (char_array[i] == ' ') { 
      if (i == 0) 
       continue; 
      else 
       j++; 
     } else { 
      continue; 
     } 
    } 
    return int_array; 
} 

int main() { 
    int i, n, length_of_char; 
    printf("enter no. of elements"); 
    scanf("%d\n", &n); 
    char *char_array; 
    char_array = (char*)malloc(n * 5); 
    fgets(char_array, sizeof(char_array), stdin); 
    printf("%s\n", char_array); 
    length_of_char = strlen(char_array); 
    printf("%d\n", length_of_char); 
    int *int_array = (int*)calloc(n, sizeof(int)); 
    cstois(&char_array[0], &int_array[0], length_of_char); 
    for (i = 0; i < n; i++) 
     printf("%d\n", int_array[i]); 
    free(char_array); 
    free(int_array); 
    return 0; 
} 
+0

あなたのテスト 'if(i == 0)continue;は最初の文字がスペースである場合にのみ動作します。私の編集を見て、読みやすくするためにあなたのコードをインデントしてスペースを取ることを学んでください。 'fgets()'はまだ3バイトしか読みません。... sizeof(char_array);ではなく、配列の長さを使用します。 – chqrlie

関連する問題