Язык C определяет длину массива в зависимости от количества введенных пользователем цифр - PullRequest
1 голос
/ 07 марта 2019

У меня есть код ниже, в котором пользователь вводит номер своей карты, при этом каждая цифра сохраняется как элемент в массиве переменных digits[].

Я пытаюсь добиться остановки цикла for после сохранения всех цифр, однако я пытаюсь установить цикл в соответствии с длиной введенного номера карты.

Я попробовал приведенный ниже код, используя sizeof(cardNo), сохраненный в переменной длине и установив длину в качестве условия цикла.

Допустим, пользователь вводит 1234 результат, который я получаю с помощью приведенного ниже кода, который выполняется:43210000, когда то, что я ищу, это просто 4321.

, если я установлю int digits на digits[4] и условие цикла на <4, это даст мне 4321, но, очевидно, это ограничивает меня, когда пользователь вводит только 4цифры, когда на самом деле я хочу, чтобы это было гибким, т.е. если они введут 6 цифр, это даст мне 123456, если они введут 8 цифр, это даст мне 12345678 и т. д. </p>

Любые идеи или предложения, пожалуйста?

long cardNo = get_long("Enter Card Number: ");
int length = sizeof(cardNo);
int count = 0;
int digits[length];

for (int i = 0; i < length; i++) {
  digits[i] = cardNo % 10;
  cardNo /= 10;
  printf("%i\n", digits[i]);
} 
printf("\n");

Ответы [ 3 ]

3 голосов
/ 07 марта 2019

Длина числа основана на его логарифме 10:

#include <math.h> //log10
....
    int len = log10(cardNo) + 1;
...

Не забудьте связать с библиотекой математики (gcc ... -lm)

0 голосов
/ 07 марта 2019

Код может быть проще, учитывая максимальное количество чисел (по выбору разработчика для хранения контейнера фиксированного размера в стеке, как статического и т. Д.):

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

#define STRINGIFY(x) STRINGIFY2(x)
#define STRINGIFY2(x) #x

#define MAX_NUMBERS 16

int main() {
    char cardNum[MAX_NUMBERS + 1];
    size_t sizeCard;

    printf("Enter card numbers\n");
    scanf("%" STRINGIFY(MAX_NUMBERS) "s", cardNum);
    sizeCard = strlen(cardNum);
    for (int i = 0; i < sizeCard; i++) {
        printf("%c\n", cardNum[i]);
    }
    printf("\n");
}
0 голосов
/ 07 марта 2019

Идиома: измерение-выделение-генерация.

size_t n =0;
for (; i < cardno; ) {
  cardNo /= 10;
  n++;
} 
if(!n)n++;//0
int*digits=malloc(n*sizeof(int));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...