【问题标题】:Using getchar() to take multiple values.使用 getchar() 获取多个值。
【发布时间】:2015-07-05 15:09:35
【问题描述】:

我能否以某种方式使用 getchar() 在命令行中运行,直到我点击“\n”。 假设我想扫描我输入的所有值,例如。

21 23 1 78 54 '\n'。我想将所有五个值扫描到一个数组中。我无法扫描它们。是因为每个值之间的间距吗?或者有没有我们可以使用的函数?

提前致谢

【问题讨论】:

  • 对 c 了解不多,但您不能使用循环按空格或类似的东西打破这些值吗?
  • 为什么不用scanf?
  • 试试这个:while((input=getchar()) != '\n').
  • @user3928326 请接受答案

标签: c arrays algorithm


【解决方案1】:

如果您不打算使用getchar(),那么我有一个使用scanf%d 转换说明符的简单解决方案:

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

%d 转换说明符告诉scanf 跳过任何前导空格并读取到下一个非数字字符。返回值是成功转换和分配的次数。由于我们正在读取单个整数值,因此成功时返回值应为 1。

【讨论】:

    【解决方案2】:
    #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;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-11-27
      • 2013-02-26
      • 2019-09-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多