You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 03:45:24