Положить строку в целочисленный массив

Пользователь вводит строку, которая содержит три числа в 16-й СС, разделенные пробелом (каждое число содержит по две цифры). Эта строка передается в отдельную функцию, и там она разделяется по пробелу. Затем каждые составные части строки кладутся в целочисленный массив. Потом массив возвращается при помощи return;

Недавно перешел на СИ.

Пример моего кода:

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

char* subkeys(char *str) {
    
    int i = 0;
    char array[3] = {0};
    char* token = strtok(str, " ");
    array[i] = *token;
    printf("%d\n", array[i]);

    while (token != NULL) {
        i++;
        token = strtok(NULL, " ");
        array[i] = *token;
        printf("%d\n", array[i]);
    }
    
    return 0;
}

int main() {
    
    int length = 6 + 2 + 1; //3 числа, 2 пробела и 1 терминатор
    char str[length];
    fgets(str, length, stdin);
    subkeys(str);
    
    return array;
}

Во-первых, проблема с выводом массива. Понятия не имею как это. Во-вторых, вместо печатания элементов массива, оно печатает совершенно другие числа.


Ответы (1 шт):

Автор решения: Harry

Ну, я бы исправил ваш код так:

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

int* subkeys(char *str) {
    
    int i = 0;
    int * array = malloc(3*sizeof(int));
    for(char* token = strtok(str, " "); i < 3 && token;
        token = strtok(NULL, " "))
    {
        array[i++] = strtol(token,NULL,16);
    }
    return array;
}

int main() {
    
    char str[128];
    fgets(str, 128, stdin);
    int * a = subkeys(str);

    for(int i = 0; i < 3; ++i)
        printf("a[%d] = %4d (0x%02x)\n",i+1,a[i],a[i]);

    free(a);
}

Защит от дурака тут две — не один пробел между числами, и больше, чем три введенных числа. Если и ее убрать, можно и еще проще...

→ Ссылка