如何在C语言中提取字符串中的10/3并完成浮点运算存储结果?
解决从字符串提取分数并计算除法的问题
看起来你核心的问题出在两个地方:分隔符设置错误,以及变量作用域导致无法正确存储分割后的两个数字。咱们一步步来解决:
1. 修正分隔符问题
你原来定义的#define SLASH "\\."是用点号(.)作为分隔符,但你要分割的是分数里的斜杠(/),这直接导致strtok没法把"10/3"拆成"10"和"3"。首先把分隔符改成正确的:
#define SLASH "/"
2. 正确提取并存储两个数字
之前你把计数变量i放在while循环内部,每次循环都会重置为0,自然没法把第二个数字存到数组的第二个位置。把数组和计数变量移到循环外面,就能正确保存两个分割后的数值了:
#include<stdio.h> #include<string.h> #include<stdlib.h> #define SLASH "/" int main(void){ char path[100]; printf("Enter fraction (like 10/3): \n"); fgets(path, sizeof(path), stdin); // 安全去掉换行符,避免越界问题 path[strcspn(path, "\n")] = '\0'; double nums[2]; int i = 0; char *token = strtok(path, SLASH); while(token != NULL && i < 2){ // 限制只取前两个数字,避免数组越界 nums[i] = atof(token); // 把字符串转成double类型 printf("Extracted: %.2lf\n", nums[i]); token = strtok(NULL, SLASH); i++; } // 计算除法,必须检查除数不为0 if(i == 2 && nums[1] != 0){ double result = nums[0] / nums[1]; printf("Result of %.2lf / %.2lf = %.18lf\n", nums[0], nums[1], result); // 这里可以把result存到你需要的变量里 } else { printf("Invalid fraction format or division by zero!\n"); } return 0; }
3. 整合到你的大型程序中
在j == 7的分支里,注意strtok会修改原字符串,所以要先复制一份arr3[j]的内容再处理,避免破坏原始数据。示例如下:
// 假设你已经定义了这些变量: char temp_arr[100], temp_arr2[100]; #define SLASH "/" // ... 其他代码 ... } else if(j == 6){ arr3[j][strlen(arr3[j]) - 1] = '\0'; sprintf(temp_arr, "%.18lf", atof(arr3[j])); strcat(arr3[j], temp_arr); strcat(arr3[j], new_line); } else if(j == 7){ // 先复制原字符串,防止strtok修改arr3[j]的原始内容 char temp_str[100]; strcpy(temp_str, arr3[j]); // 去掉末尾的换行或多余字符 temp_str[strcspn(temp_str, "\n")] = '\0'; double nums[2]; int m = 0; char *token = strtok(temp_str, SLASH); while(token != NULL && m < 2){ nums[m] = atof(token); printf("Extracted number %d: %.2lf\n", m+1, nums[m]); token = strtok(NULL, SLASH); m++; } // 计算并处理结果 if(m == 2 && nums[1] != 0){ double result = nums[0] / nums[1]; // 把结果格式化后存到temp_arr sprintf(temp_arr, "%.18lf", result); // 替换arr3[j]的内容为运算结果(根据你的需求调整) strcpy(arr3[j], temp_arr); strcat(arr3[j], new_line); } else { // 处理无效格式或除零的情况 strcpy(arr3[j], "Invalid fraction"); strcat(arr3[j], new_line); } }
关键注意点
strtok会修改原字符串,所以一定要先复制一份再处理,避免破坏arr3[j]里的原始CSV数据。- 必须检查除数是否为0,否则会触发程序崩溃。
- 使用
strcspn去掉换行符比strlen(path)-1更安全,因为如果输入刚好填满缓冲区,strlen(path)-1会导致数组越界。
内容的提问来源于stack exchange,提问作者Brian.H
相关产品推荐
相关产品推荐

