Сохранить строку с числами в виде целочисленного массива - PullRequest
1 голос
/ 14 июня 2019

Я пишу программу на 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]);
    }
}

Ответы [ 2 ]

3 голосов
/ 14 июня 2019

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

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

Вы можете использовать fgets, затем sscanf с %n in loop.

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]);
}
2 голосов
/ 14 июня 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...