C语言中字符数组解析为浮点数组结果始终为0.00如何解决?
问题根因定位
- 第一处错误是输入读取逻辑的设计缺陷:当前
while循环会持续读取标准输入的行内容,只有当读到完全是换行符的空行时才会中断循环,这会导致最终input数组被空行覆盖,存储的根本不是用户输入的带浮点数的有效内容。后续调用strtof解析时,从换行符开头找不到合法数字,所有解析结果自然都是0.00。 - 第二处错误是浮点数解析逻辑的设计缺陷:就算修正输入读取的问题,现有解析代码也无法正确拆分多组浮点数:每次调用
strtof都固定传入input的首地址作为解析起点,完全没有用endPtr指针跳到下一个待解析的位置;同时循环终止条件设为遍历完字符串所有字符,和实际需要解析的浮点数个数完全不匹配。
修复方案
- 调整输入读取逻辑:遇到纯换行的空行就跳过,读到带有效内容的输入行就退出读取流程,避免有效内容被空行覆盖
- 调整浮点数解析逻辑:以动态指针记录当前解析位置,每解析完一个浮点数就把该位置更新为
endPtr指向的位置,直到指针碰到字符串末尾,就停止解析
修复后代码
#include <stdio.h> #include <stdlib.h> #include <ctype.h> #include <string.h> #define ARRAY_SIZE 52 int main(){ char input[ARRAY_SIZE]; memset(input,0,ARRAY_SIZE * sizeof(char)); char* endPtr; float parsed[ARRAY_SIZE]; memset(parsed,0,ARRAY_SIZE * sizeof(float)); int parsedCount = 0; while(fgets(input, ARRAY_SIZE, stdin)){ // 跳过无实际内容的空行 if(strcmp(input, "\n") == 0){ continue; } break; } // 从字符串起始位置开始逐段解析 char* parsePos = input; while(*parsePos != '\0' && parsedCount < ARRAY_SIZE){ parsed[parsedCount] = strtof(parsePos, &endPtr); // 无有效可解析内容时直接退出 if(endPtr == parsePos){ break; } printf("%.2f ", parsed[parsedCount]); parsePos = endPtr; parsedCount++; } return 0; }
内容的提问来源于stack exchange,提问作者ptr024
相关产品推荐
相关产品推荐

