C, чтение нескольких чисел из одной строки ввода (сканирование?)

StackOverflow https://stackoverflow.com/questions/2539796

  •  23-09-2019
  •  | 
  •  

Вопрос

Я написал приложение на C, которое ожидает на входе две строки.Первый ввод сообщает, насколько большим будет массив целых чисел, а второй ввод содержит значения, разделенные пробелом.Например, следующий ввод

5
1 2 3 4 99

должен создать массив, содержащий {1,2,3,4,99}

Каков самый быстрый способ сделать это?Моя проблема заключается в том, чтобы прочитать несколько чисел, не перебирая всю строку, проверяя, является ли это пробелом или числом?

Спасибо.

Это было полезно?

Решение

int i, size;
int *v;
scanf("%d", &size);
v = malloc(size * sizeof(int));
for(i=0; i < size; i++)
    scanf("%d", &v[i]);

Запомни free(v) после того, как вы закончите!

Кроме того, если по какой-то причине у вас уже есть числа в строке, вы можете использовать sscanf()

Другие советы

Вот пример взят из http://www.cplusplus.com/reference/cstring/strtok/ что я адаптировался к нашему контексту.

Он разбивает цепочку str на подцепи, а затем каждую часть преобразую в int.Я ожидаю, что строка ввода будет состоять из чисел, разделенных запятыми, и ничего больше.Размер — это размер вашего массива.Вам следует выполнить scanf("%d", &size);как заявил Денилсон в своем ответе.В конце у вас есть массив int со всеми значениями.

int main(){
  int size = 5, i = 0;
  char str[] ="10,20,43,1,576";
  int list[size];
  char * pch;
  printf ("Splitting string \"%s\" into tokens:\n",str);
  pch = strtok (str,",");
  list[i] = atoi(pch);
  i++;
  while (pch != NULL)
  {
    pch = strtok (NULL, ",");
    if(pch != NULL)
      list[i] = atoi(pch);
    i++;
  }

  for(i=0;i<size;i++){
    printf("%d. %d\n",i+1,list[i]);
  }
  return 0;
}

Здесь «N» — количество элементов массива «А».

int N, A[N];
printf("Input no of element in array A: ");
scanf("%d", &N);
printf( "You entered: %d\n", N);
printf("Input array A elements in one line: ");
for(int i=0; i<N; i++){
   fscanf(stdin, "%d", &A[i]);
   printf( "A[%d] is: %d\n", i, A[i]);
}

scanf() это своего рода боль в шее.Проверить strtol() для такого рода проблем это очень облегчит вашу жизнь.

В этом коде используется прямой подход к чтению каждого символа с помощью getchar(). Мы продолжаем читать число, пока не находим пустое место. После этого индекс 'i' массива обновляется. Это повторяется до тех пор, пока не появится новая строка('\ n') встречается

#include<iostream>
main()
{
  char ch;
  int arr[30] ;
  ch =getchar();
  int num = 0;
  int i=0;
  while(ch !='\n')
  {
    if(ch == ' ')
    { 
      arr[i] = num;
      i++;
      num = 0;
    }
    if(((ch -48) >=0) && (ch-48 <=9))
      num = (num*10) + (ch - 48);
    ch = getchar();   
  }
  arr[i] = num;
  for(int j=0;i<=i;j++)
     std::cout<<arr[i]<<" ";
 }
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top