2014-09-04 5 views
-4

Это моя реализация алгоритма LUHN В моем коде для ввода я хочу создать массив значений, длина которых может варьироваться в зависимости от пользовательского ввода. ниже - это то, что я пытался, но, похоже, не работает ... также, если мне нужно использовать функцию malloc, как я могу ее использовать? кроме того, что все работает нормально, также предлагайте некоторые оптимизации, которые могут быть сделаны.Как создать массив с неопределенным размером?

#include<stdio.h> 

int main() 

{ char a[100]; 
    int sum=0,c=0,i; 


    printf("enter the card you use\n"); 
    scanf("%16s",&a[i]); 

    for(int m=0;a[m]!='\0';m++){ 

     c++; 
    } 

    for(int j=0;j<c;j++){ 
    int k,l; 
    if(j%2==0){ 
    k=a[j]%10; 
    l=a[j]/10; 
    a[j]=k+l; 
    sum=sum + a[j]; 
    }  
    else{ 
    sum = sum + 2*a[j]; 
    } 
    }     
    if(sum % 10 ==0 && c==13)     
    printf("VISA\n"); 
    else if(sum % 10==0 && c==16) 
    printf("MASTERCARD\n"); 
    else if(sum % 10==0 && c==15) 
    printf("AMERICAN EXPRESSWAY\n"); 
    else 
    printf("INVALID\n"); 

    return 0; 
} 
+3

использовать указатели, поиск таНоса. – Andromeda

+0

http://en.wikipedia.org/wiki/C_dynamic_memory_allocation – someuser

+0

определить массив после того, как пользователь вводит размер массива или выделяет массив, используя malloc/calloc. –

ответ

2

Есть несколько вещей, которые не соответствуют вашему коду.

Для этого: вы не инициализировали a, но на нем сразу же возникло условие петли for(int i=0;a[i]!='\0';i++).

На ваш вопрос:

Если вы знаете, во время выполнения длину требуемого массива, то вы можете выделить память кучи для него с

void * array_ptr = malloc(size_of_array_element * num_elements); 

Или в стеке (С99 и выше):

type array[num_elements]; 

Если размер ваших изменений массива на протяжении выполнения, то вы должны передать его с помощью malloc (или calloc) и изменить его размер, как nesses сары:

void * resized_array_ptr = realloc(array_ptr, size_of_array_element * num_elements); 
+0

Вы можете выделить стек с помощью C90 с помощью функции библиотеки alloca(). –

+0

@ ЭльдарДорджиев 'alloca' - это вариант, но я бы отговорил его использование. Он также широко не поддерживается всеми компиляторами и имеет опасности, связанные с встраиванием внутри петель. C99 VLAs намного более стабильны и достигают того же результата. –

+0

Есть ли способ сделать массив соответствующим образом изменить размер, когда пользователь вводит символ, а не вручную вводит размер массива? – user3315556

1

я хочу создать массив значений, длина которого может варьировать в зависимости от пользовательского ввода.

Вы можете определить свой массив после ввода данных пользователя, как

int userinput; 
scanf("%d\n",&userinput); 
int arr[userinput]; 

Использования таНоса вы можете сделать

int *arr= malloc(sizeof(int)*userinput);