如何读取一行中的多个浮点数并将其存入float数组
问题解答
方案1:基于已读取的字符串解析(推荐)
你完全可以基于fgets读取到的整行字符串来解析浮点数,这种方案的优势是可以严格控制只读取当前一行的数值,不会出现输入流错位、误读下一行内容的问题,是处理单行数值输入的常用稳妥方案。
你可以用C标准库的strtof函数完成解析,完整实现代码如下:
#include <stdio.h> #include <stdlib.h> int main(){ char input[500]; float values[50]; // 记录实际读取到的浮点数个数,避免数组越界 int val_count = 0; // 读取整行输入 fgets(input, sizeof(input), stdin); char *parse_pos = input; char *end_pos; // 循环解析浮点数,最多读取50个 while (val_count < 50) { float cur_val = strtof(parse_pos, &end_pos); // 指针未移动说明没有可解析的有效浮点数,终止循环 if (parse_pos == end_pos) { break; } values[val_count++] = cur_val; // 移动解析指针到下一个待解析位置 parse_pos = end_pos; } // 以下为测试输出代码,可根据需求调整 printf("成功读取%d个浮点数:\n", val_count); for (int i = 0; i < val_count; i++) { printf("%.2f ", values[i]); } return 0; }
strtof会自动跳过数字前后的空格、换行等空白字符,刚好适配你给出的空格分隔的数值输入场景。
方案2:直接读取浮点数(适用不限行的场景)
如果你不需要单独存储整行输入内容,也可以直接用fscanf循环从标准输入读取浮点数:
#include <stdio.h> int main(){ float values[50]; int val_count = 0; while(val_count < 50 && fscanf(stdin, "%f", &values[val_count]) == 1) { val_count++; // 如果需要严格限制只读一行,可以加判断读到换行就终止 int next_char = getc(stdin); if (next_char == '\n' || next_char == EOF) { break; } ungetc(next_char, stdin); // 不是换行的话把字符塞回流里继续解析 } return 0; }
这种方案的缺点是处理单行输入时需要额外判断换行,容错性比方案1低。
内容的提问来源于stack exchange,提问作者Krishna Raju
相关产品推荐
相关产品推荐

