C, чтение нескольких чисел из одной строки ввода (сканирование?)
Вопрос
Я написал приложение на 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]<<" ";
}