2010-03-29 4 views
4

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

5 
1 2 3 4 99 

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

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

Спасибо.

ответ

10
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()

+0

Я думал, что он будет искать числа, разделенные «\ n»? – migajek

+2

'% d' (а также большинство% конверсий, но не все) автоматически пропускает пробелы. Прочтите документацию scanf для получения более подробной информации! –

+2

«Если по какой-то причине»? Вы никогда не должны использовать 'scanf' и предпочитаете использовать' fgets' с 'sscanf'. http://c-faq.com/stdio/scanfprobs.html – jamesdlin

0

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

+1

вместе с strtok это может быть интересно, но я не знаю, как читать все строка сначала;/ – migajek

+0

@michal, 'fgets()' будет читать строку. Я не знаю, зачем вам 'strtok()' для вашей проблемы. –

+0

strtol даст только первый номер. Это не цель здесь? –

1

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

Он разбивает цепочку str в подцепочках, а затем конвертирует каждую часть в int. Я ожидаю, что строка ввода - это номера, разделенные запятыми, и ничего больше. Размер - это размер вашего массива. Вы должны сделать scanf ("% d", &); как сказал Денилсон в своем ответе. В конце у вас есть массив 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; 
} 
1

Здесь «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

Вы можете улучшить свой ответ, объяснив, как это отвечает на вопрос ОП. – MicroVirus

-1

Этот код использует прямой вперед подход чтения каждого символа через GetChar(). Мы идем на чтение номер Util мы находим пустой индекс space.The «я» из массива обновляется после that.This повторяется до конца строки («\ п») встречается

#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

Хотя этот код может ответить на вопрос, предоставляя дополнительный контекст относительно того, как и/или почему он решает проблему, улучшит долгосрочную ценность ответа. Пожалуйста, прочитайте это https://stackoverflow.com/help/how-to-answer –

+0

Этот подход терпит неудачу, когда числа отрицательны или начинаются с символа '' + ''. Это не C-код. – chux

Смежные вопросы