C, чтение нескольких чисел из одной строки ввода (scanf?) - PullRequest
5 голосов
/ 29 марта 2010

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

5
1 2 3 4 99

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

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

Спасибо.

Ответы [ 5 ]

14 голосов
/ 29 марта 2010
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()

1 голос
/ 21 ноября 2015

Здесь 'N' - количество элементов массива в массиве 'A'

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]);
}
1 голос
/ 06 февраля 2013

Вот пример, взятый из 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;
}
0 голосов
/ 17 июня 2017

Этот код использует прямой подход чтения каждого символа через 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]<<" ";
 }
0 голосов
/ 29 марта 2010

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

...