Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C scanf-未知数组大小_C_Scanf - Fatal编程技术网

C scanf-未知数组大小

C scanf-未知数组大小,c,scanf,C,Scanf,我想将值(浮点)读入数组,但我不知道值的数量 我的意见是 Enter values: 1.24 4.25 1.87 3.45 .... etc 如何将此输入加载到数组?我知道输入在输入0或EOF时结束 while(0 or EOF){ scanf("%f", &variable[i]) i++; } 多谢各位 i = 0; while(scanf("%f", &variable[i])!=-1) { i++; } scanf在EOF之后尝试读取时返回

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

我的意见是

Enter values: 1.24 4.25 1.87 3.45 .... etc
如何将此输入加载到数组?我知道输入在输入0或EOF时结束

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

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

scanf
EOF

之后尝试读取时返回
-1
,我想您真正关心的是用户将要输入的浮点数未知。您可以使用指针指向float,对一些预定义的大小执行malloc,如果在接受输入时已达到限制,则执行realloc以增加内存。您需要在执行reaccloc时处理以前接受的数据。

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

// 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++;
}
另外,请注意
变量
不是一个好的变量名。使用描述变量用途的名称


编辑:将realloc中的大小更正为alloc
size*2
浮动,并避免像unwind指出的那样,它严重损坏。

您可以动态分配数组,然后在先前分配的缓冲区已满时为其重新分配内存。请注意,
scanf
格式字符串中的转换说明符
%f
读取并丢弃前导空白字符。从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;
}
#包括
#包括
内部主(空){
尺寸长度=4;
浮动*buf=malloc(长度*sizeof*buf);
如果(buf==NULL){//检查NULL
printf(“内存不足,无法分配。\n”);
返回1;
}
尺寸i=0;
float*temp;//在realloc失败时保存buf
//读取,直到出现EOF或匹配失败
//在*nix上按Ctrl+D以发出输入结束(EOF)的信号
//在Windows系统上按Ctrl+Z组合键
而(scanf(“%f”,buf+i)==1{
i++;
如果(i==len){//buf已满
温度=buf;
len*=2;
buf=realloc(buf,len*sizeof*buf);//重新分配buf
如果(buf==NULL){
printf(“内存不足,无法重新分配。\n”);
buf=温度;
打破
}
}
}
如果(i==0){
printf(“无输入读取\n”);
返回1;
}
//工艺buf
对于(尺寸j=0;j
发布的伪代码的哪一部分不起作用?-1,因为如果无法进行单个转换,它也会返回0。这将使
变量[i]
留下一个未定义的值,这不是一件好事。单次转换是什么意思?
scanf()
返回成功转换的次数(它处理的
%
-说明符的数目),或
EOF
。因此,您的代码应该期望它返回
1
,因为在每个调用中都有一个转换尝试。另外,
-1
是编写
EOF
的一种非常糟糕的方法。明白了。我知道scanf返回读取的字节数。谢谢你把它清理掉。不,不是字节。它返回成功的
%
转换数。请阅读-1,注意
size
从“浮点数”变为“字节数”,这将非常糟糕。另外,检查动态内存分配是否失败也是一种很好的做法。此外,将真实代码和明显的伪代码混合在一起有点奇怪,而(0或EOF)line.oops,更正大小为到处都是“浮点数”。至于与伪代码的混合,我只是以OP的代码为基础,帮助他们找到插入它的位置。反对者是否介意评论他们为什么反对?