2017-08-11 12 views
1

私はint a[50];のような整数の配列を持っています。今度は、整数配列にユーザーが入力した値を整数として保存します。
問題は、ユーザーが入力する要素の数がわからないため、配列全体をトラバースできないことです。ユーザ入力を動的に受け取り、それを整数配列に格納する方法

ユーザが値を動的に入力し、整数配列に格納して表示する方法はありますか?

あなたがここに見つけることができる機能を変換入力

int readinput(int *value) 
{ 
    int status; 
    //function returns 0 on conversion -1 if exit keywoard entered 
    return status; 
} 


int value, *table = NULL,size = 0; 
while (!readinput(&value)) 
{ 
    table = realloc(table, (size++ + 1) * sizeof(int)); 
    if (table == NULL) 
    { 
     break; 
    } 
    table[size] = value; 
} 

例の終わりとしてのreallocを使用して、特定の入力を行うことができます

+1

各ユーザー入力後にmemmoryをアレイ用に再割り当てすることができます。 –

+0

ヒープ上に動的にメモリを割り当てる必要があります。 realloc()関数を使用して、すべての入力の後に "配列"を展開する必要があります。 –

+2

最後の番号が入力されたことをユーザーがどのように「教える」べきですか?答えはこれに基づいています。 –

答えて

0

を配列に含める要素の数。その後、mallocを呼び出して配列に入力を格納します。

+2

と数字のある4ページがある場合は、入力する前にそれらをすべて数えるようにしてください:) –

+0

これは、コメントではなく答えになります。 –

0

scanf() functionには%d as format specifierが使用されています。 whileループは戻り値をチェックして、変換が成功したかどうかを検出できるようにします。有効な番号以外が入力された場合、ループは中断されます。有効な数字もスペースで始まりますが、他の文字ではありません。

メモリはmalloc()で割り当てられ、ユーザが数字を入力する度にrealloc()と再割り当てされます。再割り当てに関するエラーチェックはありません。これは、一時ポインタlike hereで行う必要があります。

さらに、このコードはすべての単一番号に対して再割り当てされます。また、すべての入力の再割り当てを避けるために、より大きな手順で再割り当てすることもできます。しかし、多くのデータがある場合にのみ重要です。この場合、速度の向上は重要ではありません。

メモリが不要になったら、free()を使用する必要があります。

1<Enter> 
2<Enter> 
3<Enter> 
any characters<Enter> 
をして取得します::

ユーザーが入力することができます

Numbers entered: 
1 2 3 

出力として。

コード:このコードはうまく動作するはずです

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

int main (int argc, char *argv[]) 
{ 
    size_t idx; 
    int number; 
    size_t count = 0; 
    int* numberArr = malloc(sizeof(*numberArr)); 

    printf("Enter each number separated by <Enter>,\n" 
      "to abort type any other character that isn't a number!\n"); 
    while (scanf("%d", &number) == 1) 
    { 
     numberArr = realloc(numberArr, (count + 1) * sizeof(*numberArr)); 
     numberArr[count] = number; 
     count++; 
    } 

    printf("\nNumbers entered:\n"); 
    for (idx = 0; idx < count; idx++) 
    { 
     printf("%d ", numberArr[idx]); 
    } 
    printf("\n"); 

    free(numberArr); 

    return 0; 
} 
+0

こんにちは@Mistiqueこれまたは任意の回答があなたの質問を解決した場合、チェックマークをクリックして[受諾する](https://meta.stackexchange.com/q/5234/179419)を検討してください。これは、あなたが解決策を見つけ出し、回答者とあなた自身の両方に評判を与えていることを広範なコミュニティに示します。これを行う義務はありません。 –

0

これらのステップの配列がarr size + BUFFER_SIZEreallocます後、あなたは、あなたが好きにBUFFER_SIZEを変更することができます。

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

#define BUFFER_SIZE 50 

int main(void) 
{ 
    int * userInputBuffer = malloc(sizeof(int) * BUFFER_SIZE); 
    int userInput; 
    int counter = 0; 
    int reallocCounter = 1; 

    while ((scanf(" %d", &userInput)) == 1) 
    { 
     if ((counter % BUFFER_SIZE) == 0) 
     { 
      userInputBuffer = realloc(userInputBuffer, (reallocCounter++ + 1) * BUFFER_SIZE * sizeof(int)); 
     } 
     userInputBuffer[counter++] = userInput; 
    } 

    for (int i = 0; i < counter; i++) 
    { 
     printf("User input #%d: %d\n", i + 1, userInputBuffer[i]); 
    } 

    free(userInputBuffer); 
    return 0; 
} 
+1

'C'とタグ付けされていますが、' #include 'は' C++ 'です。あなたのプログラムをテストするなら、それに失敗する普通のCコンパイラを使うべきです。 –

+0

私の悪いhehのOfc、ありがとう –

関連する問題