Сохранить строку с числами в виде целочисленного массива

Я пишу программу на C, где есть пользовательский ввод. Этот вход представляет собой строку с целочисленными значениями, разделенными пробелом. Числа (кроме первого) должны храниться в целочисленном массиве. Первое число указывает, сколько чисел нужно сохранить (то есть размер массива).

Как проще всего это сделать на C? Вот пример:

input--> "5 76 35 95 14 20"

array--> {76, 35, 95, 14, 20}

Я искал вокруг, но я не могу найти решение своего вопроса. На данный момент я пытался сохранить значения ввода в массиве символов, и, когда есть пробел, я преобразовываю эту строку в целое число, используя atoi(), и добавляю ее в массив целых чисел. Но он печатает странные значения. Это код:

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

int main()
{
    char text[10];
    scanf("%s", text);

    int nums[4];
    int indNs = 0;

    char lastNum[10];
    int indLN = 0;

    for(int i = 0; i < 10; i++)
    {
        if(text[i] == ' ')
        {
            nums[indNs] = atoi(lastNum);
            indNs++;

            sprintf(lastNum, "%s", "");
            indLN = 0;
        } else
        {
            lastNum[indLN] = text[i];
            indLN++;
        }
    }

    nums[indNs] = atoi(lastNum);

    for(int i = 0; i < 4; i++)
    {
        printf("%d\n", nums[i]);
    }
}

person ARD    schedule 14.06.2019    source источник
comment
fgets, затем sscanf в цикле - самый простой.   -  person kiran Biradar    schedule 14.06.2019
comment
Нравится int array[5]; int unused; sscanf(input, "%d %d %d %d %d %d", &unused, &array[0], &array[1], &array[2], &array[3], &array[4])?   -  person KamilCuk    schedule 14.06.2019
comment
stackoverflow.com/a/56594003/6699433   -  person klutt    schedule 14.06.2019
comment
@Kamilcuk как насчет 10 3 6 4 6 4 5 5 4 5 4   -  person 0___________    schedule 14.06.2019
comment
@Carcigenicate Я загрузил пост.   -  person ARD    schedule 14.06.2019
comment
@ARD Посмотри на мою ссылку. Я ответил на аналогичный вопрос ранее.   -  person klutt    schedule 14.06.2019
comment
@ARD Ups. Я выбрал неправильную ссылку, даже если она тоже помогает, но эта лучше: stackoverflow.com/a/56570260/6699433   -  person klutt    schedule 14.06.2019


Ответы (2)


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

scanf("%s", text); //Wrong, always reads only first number.

Вы можете использовать fgets, за которым следует sscanf с %n в цикле.

char buf[100];

int *array = NULL;
int numElements = 0;
int numBytes = 0;
if (fgets(buf, sizeof buf, stdin)) {

   char *p = buf;
   if (1 == sscanf(buf, "%d%n", &numElements,&numBytes)){
       p +=numBytes;
       array = malloc(sizeof(int)*numElements);
       for (int i = 0;i<numElements;i++){
         sscanf(p,"%d%n", &array[i],&numBytes);
         p +=numBytes;
         printf("%d,", array[i]);
       }
   }
}

%n возвращает количество байтов, прочитанных до сих пор, таким образом, увеличивая buf количество байтов, прочитанных до сих пор.


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

int *array = NULL;
int numElements = 0;


scanf("%d", &numElements);
array = malloc(sizeof(int)*numElements);

for(int i=0;i<numElements;i++)
{
    scanf("%d", &array[i]);
    printf("%d ", array[i]);
}
person kiran Biradar    schedule 14.06.2019
comment
Нет необходимости читать всю строку в буфер, просто читайте каждое целое число отдельно, используя scanf("%d", &foo) - person HAL9000; 14.06.2019
comment
О, и есть malloc(), но нет free(). - person HAL9000; 14.06.2019

В этом случае вы можете использовать, например, стандартную функцию C strtol, объявленную в заголовке <stdlib.h>.

Например

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

int main( void )
{
    const char *s = "5 76 35 95 14 20";

    char *p = ( char * )s;

    int n = ( int )strtol( p, &p, 10 );

    int *a = malloc( n * sizeof( int ) );

    for ( int i = 0; i < n; i++ )
    {
        a[i] = strtol( p, &p, 10 );
    }

    for ( int i = 0; i < n; i++ )
    {
        printf( "%d ", a[i] );
    }
    putchar( '\n' );

    free( a );
}

Вывод программы

76 35 95 14 20

Чтобы прочитать строку с пробелами, вы должны использовать стандартную функцию C fgets.

person Vlad from Moscow    schedule 14.06.2019