gpt4 book ai didi

c - 从字符串中取出 10/3 并在 C 中执行数学运算

转载 作者:行者123 更新时间:2023-11-30 19:06:17 25 4
gpt4 key购买 nike

有人能帮我弄清楚如何从字符串中提取 10/3,将 10/3 作为 float / double 执行数学运算,并存储结果吗?我尝试修改现有的旧代码,但无法使其工作。这是代码:

#include<stdio.h>
#include<string.h>

#define SLASH "\\."

int main(void){

char path[100];

printf("Enter file path: \n");
fgets(path, sizeof(path), stdin);
path[strlen(path) - 1] = '\0';

char *token = strtok(path, SLASH);

while(token != NULL){
printf("%s\n", token);
/*Rather than printf the result
I've tried saving the result to
a variable but I could only get
10 to save*/
token = strtok(NULL, SLASH);
}

return 0;
}

然后我会将解决方案放入更大程序的这一部分中:

    } else if(j == 6){
arr3[j][(strlen(arr3[j])) - 1] = NULL;
sprintf(temp_arr, "%.18lf", atof(arr3[j]));
strcat(arr3[j], temp_arr);
strcat(arr3[j], new_line);
} else if(j == 7){

我从 .csv 文件中读取了以下内容:

从文件输入:

input from file

我需要获得的输出是:

正确输出:

Correct output

有人能给我一些关于如何做到这一点的想法吗?我尝试使用 for 循环而不是 while 循环,希望将 10 保存到 array[0] 并将 3 保存到 array[1],但我只会得到 array[0] = 10 和 array[1] = 0。其他时候我只会得到随机垃圾而不是零。使用这种 token 方法之前看起来非常简单,但我无法转换此任务。这对我来说似乎并不难,但我被困住了。预先感谢任何人可以提供的任何帮助。

编辑:

我调整了第一个代码以分别保存每个代码:

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

#define SLASH "\\."

int main(void){

char path[100];

printf("Enter file path: \n");
fgets(path, sizeof(path), stdin);
path[strlen(path) - 1] = '\0';

char *token = strtok(path, SLASH);

while(token != NULL){
int i = 0;
char temp[100];
strcpy(temp, token);
printf("%s\n", token);
printf("temp = %s\n", temp);
token = strtok(NULL, SLASH);
i++;
}

return 0;

}

从那里开始,我尝试将其实现到我实际正在开发的程序中。

char temp_arr[17];
} else if(j == 6){
arr3[j][(strlen(arr3[j])) - 1] = '\0';
strcpy(temp_arr, arr3[j]);
char *token = strtok(arr3[j], SLASH);
int m = 0;
while(token != NULL){
strcpy(temp_arr2, token);
printf("temp = %s\n", temp_arr2);
token = strtok(NULL, SLASH);
m++;
}

sprintf(temp_arr, "%.18lf", atof(arr3[j]));
strcat(arr3[j], temp_arr);
strcat(arr3[j], new_line);

但我得到的是 10/3,而不是分别得到 10 和 3。

最佳答案

有多种方法可以解决这个问题。最简单的方法之一是使用 strtol 的功能来解析字符串,它将解析字符串中的数值,将该值转换为 long,并设置其 >endptr 参数指向转换中使用的最后一位数字之后的一个字符。

(在您的情况下将是 '/',但您仍应检查数字末尾和运算符之间是否存在任何中间空格)

然后,您可以从 endptr 开始向前扫描,直到找到 '/'(或用于运算符的任何非数字字符)。保存该字符,并将指针前进 1,然后再次调用 strtol 将最终数字转换为 long

将各个部分放在一起,您可以执行以下操作:

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>

#define BASE 10
#define EXPR 64

int main (void) {

long a, b;
char op,
expr[EXPR] = "",
*p = expr,
*ep;

printf ("enter expression: ");
if (!fgets (expr, EXPR, stdin)) {
fprintf (stderr, "error: user canceled input.\n");
return 1;
}

a = strtol (p, &ep, BASE); /* convert a to long */
if (p == ep) { /* no digits converted */
fprintf (stderr, "error: strtol - a, no digits found.\n");
return 1;
}

p = ep; /* set p to end-pointer */
while (*p && isspace (*p)) p++; /* skip any intervening spaces */
op = *p++; /* set operator char */

b = strtol (p, &ep, BASE); /* convert b to long */
if (p == ep) { /* no digits converted */
fprintf (stderr, "error: strtol - b, no digits found.\n");
return 1;
}

printf ("%ld %c %ld = ", a, op, b); /* output expression */
switch (op) { /* handle +, -, *, / */
case '+': printf ("%ld\n", a + b); break;
case '-': printf ("%ld\n", a - b); break;
case '*': printf ("%ld\n", a * b); break;
case '/': printf ("%f\n", (double)(a) / b); break;
default : printf ("(error - invalid operator)\n"); break;
}

return 0;
}

(注意:您还应该在每次调用 strtol 后检查 errno 以确保没有错误、上溢/下溢等。 .在转换中。这由您决定)

示例使用/输出

$ ./bin/aexprb
enter expression: 10/3
10 / 3 = 3.333333

$ ./bin/aexprb
enter expression: 10 / 3
10 / 3 = 3.333333

$ ./bin/aexprb
enter expression: 10 + 3
10 + 3 = 13

仔细检查一下,如果您还有其他问题,请告诉我。

关于c - 从字符串中取出 10/3 并在 C 中执行数学运算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48362339/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com