C scanf - 未知数组大小

时间:2014-03-04 07:29:04

标签: c scanf

我想将值(浮点数)读入数组,但我不知道数值。

我的输入是

Enter values: 1.24 4.25 1.87 3.45 .... etc

如何将此输入加载到数组?我知道当输入0或EOF时输入结束。

while(0 or EOF){
   scanf("%f", &variable[i])
   i++;
}

谢谢。

4 个答案:

答案 0 :(得分:3)

您可以动态分配数组,然后在先前分配的缓冲区已满时为其重新分配内存。请注意,格式字符串%f中的转换说明符scanf会读取并丢弃前导空格字符。来自scanf -

的手册页
  

scanf返回成功匹配和分配的项目数   它可以少于提供的数量,或者甚至为零   早期匹配失败。 如果输入结束,则返回值EOF   在第一次成功转换或匹配之前到达   失败发生。

这意味着scanf仅在遇到EOF作为第一个输入时才会返回EOF,因为EOF前面必须有换行符'\n'否则它将无法工作(取决于操作系统)。这是一个小程序,用于演示如何实现它。

#include <stdio.h>
#include <stdlib.h>

int main(void) {
    size_t len = 4;
    float *buf = malloc(len * sizeof *buf);

    if(buf == NULL) {     // check for NULL        
        printf("Not enough memory to allocate.\n");
        return 1;
    }

    size_t i = 0;
    float *temp; // to save buf in case realloc fails

    // read until EOF or matching failure occurs
    // signal the end of input(EOF) by pressing Ctrl+D on *nix
    // and Ctrl+Z on Windows systems

    while(scanf("%f", buf+i) == 1) { 
        i++;
        if(i == len) {               // buf is full
            temp = buf;
            len *= 2;
            buf = realloc(buf, len * sizeof *buf);  // reallocate buf
            if(buf == NULL) {
                printf("Not enough memory to reallocate.\n");
                buf = temp;
                break;
            }
        }
    }

    if(i == 0) {
        printf("No input read\n");
        return 1;
    }

    // process buf

    for(size_t j = 0; j < i; j++) {
        printf("%.2f ", buf[j]);
        // do stuff with buff[j]
    }

    free(buf);
    buf = NULL;

    return 0;
}

答案 1 :(得分:1)

我猜你的实际关注点是用户输入的未知浮点数。您可以使用指针浮动,对某些预定义的大小执行malloc,如果在获取输入时已达到限制,则执行realloc以增加内存。您需要在执行重新启动时处理以前接受的数据。

答案 2 :(得分:0)

您需要动态分配数组,因为您在编译时不知道它的大小。

// INITIAL_SIZE can be the average expected size of your array
#define INITIAL_SIZE 4
// size will track the current maximum size of youe array.
size_t size = INITIAL_SIZE;
// dynamic allocation for variable
float* variable = malloc(sizeof(float)*size);
// check that the allocation happened correctly
assert(variable != NULL);
// i contains the current actual size of your array
int i = 0;
while (0 or EOF) {
   if (i >= size) {
       // if the array is getting bigger than its max size, resize it.
       size *= 2;
       // This will reallocate enough memory for variable.
       variable = realloc(variable, sizeof(float)*size);
       // check that the allocation happened correctly;
       assert(variable != NULL);
       // (NB: It IS important to affect variable to the result of
       // realloc, you can't simply realloc as in some cases the
       // original pointer will become invalid!)
   }
   scanf("%f", &variable[i])
   i++;
}

顺便说一句,请注意variable不是一个很棒的变量名。使用描述变量用途的名称。

编辑:更正了realloc中的大小以分配size*2 浮动,并避免它突然崩溃,正如展开指出的那样。

答案 3 :(得分:-1)

i = 0;
while(scanf("%f", &variable[i])!=-1)
{   
   i++;
}

scanf-1之后尝试阅读时会返回EOF