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的代码为基础,帮助他们找到插入它的位置。反对者是否介意评论他们为什么反对?