2015-07-05 5 views
1

Мог ли я каким-то образом использовать getchar() для запуска командной строки до тех пор, пока не нажмем «\ n». Скажите, что я хочу сканировать все значения, которые я вводил, например.Использование getchar() для принятия нескольких значений.

21 23 1 78 54 '\ n'. Я хочу отсканировать все пять значений в массив. Я не могу отсканировать их. Это из-за расстояния между каждым значением? Или есть функция, которую мы могли бы использовать для этого?

Заранее спасибо

+0

Не знаете много о c, но не можете ли вы использовать цикл, чтобы разбить эти значения по пространству или что-то подобное? – Mihai

+1

Почему бы не использовать scanf? –

+2

Попробуйте следующее: 'while ((input = getchar())! = '\ N')'. – Wazaaaap

ответ

1

Если вы не согнуты на использование getchar() то у меня есть простое решение, используя scanf с спецификатором %d преобразования:

while (i < ARRAY_SIZE && scanf("%d", &a[i]) == 1) 
    i++ ; 

Спецификатор %d преобразования говорит scanf пропустить любого и прочесть до следующего несимметричного символа. Возвращаемое значение - это количество успешных конверсий и назначений. Поскольку мы читаем одно целое значение, возвращаемое значение должно быть 1 при успехе.

1
#include <stdio.h> 
#include <stdlib.h> 
#include <limits.h> 
#include <ctype.h> 

typedef int Type; 

typedef struct vector { 
    size_t size; 
    size_t capacity; 
    Type *array; 
} Vector; 

Vector *vec_make(void){ 
    Vector *v = malloc(sizeof(*v)); 
    if(v){ 
     v->size = 0; 
     v->capacity=16; 
     v->array = malloc(v->capacity * sizeof(Type)); 
    } 
    return v; 
} 

void vec_free(Vector *v){ 
    free(v->array); 
    free(v); 
} 

void vec_add(Vector *v, Type value){ 
    v->array[v->size++] = value; 
    if(v->size == v->capacity){ 
     Type *temp; 
     temp = realloc(v->array, sizeof(Type)*(v->capacity += 16)); 
     if(!temp){ 
      perror("realloc at vec_add"); 
      vec_free(v); 
      exit(-1); 
     } 
     v->array = temp; 
    } 
} 

int main(void){ 
    size_t size = snprintf(NULL, 0, "%d", INT_MIN); 
    char buffer[size+1]; 
    int ch, i = 0; 
    Vector *v = vec_make(); 

    while(1){ 
     ch=getchar(); 
     if(isspace(ch)){ 
      if(i == 0){ 
       if(ch == '\n') 
        break; 
       continue; 
      } 
      buffer[i] = 0; 
      //buffer validate as int => omitted 
      vec_add(v, atoi(buffer)); 
      if(ch == '\n') 
       break; 
      i = 0; 
     } else { 
      if(ch == EOF) 
       break; 
      buffer[i++] = ch; 
      if(i == size){ 
       fprintf(stderr, "error : too long\n"); 
       //skip upto delimiter? 
       i = 0; 
      } 
     } 
    } 
    //print 
    for(i = 0; i < v->size; ++i){ 
     if(i) 
      putchar(','); 
     printf("%d", v->array[i]); 
    } 
    putchar('\n'); 
    vec_free(v); 
    return 0; 
} 
Смежные вопросы