我想将值(浮点数)读入数组,但我不知道数值。
我的输入是
Enter values: 1.24 4.25 1.87 3.45 .... etc
如何将此输入加载到数组?我知道当输入0或EOF时输入结束。
while(0 or EOF){
scanf("%f", &variable[i])
i++;
}
谢谢。
答案 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
。