gpt4 book ai didi

计算错误,用+代替-

转载 作者:太空宇宙 更新时间:2023-11-04 00:27:56 25 4
gpt4 key购买 nike

出于培训原因,我想编写一个小计算器。为什么要计算 10-6 = 16 而不是 10-6 = 4?

我得到了错误:

Assertion Failed!
Expression: calc("10-6") == 4 && "could not do substraction"

这是我的代码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <assert.h>
#include <ctype.h>

double calc(char * input);
double extract_first_integer(char * input);
double extract_last_integer(char * input);
char extract_operand(char * input);

int main()
{
assert(calc("10-6") == 4 && "could not do substraction");

return 0;
}

double calc(char * input){
double num1 = extract_first_integer(input);
double num2 = extract_last_integer(input);
char operand = extract_operand(input);
printf("operand is %c\n", operand);
switch (operand)
{
case '-':
printf("num1 - num2: %f\n", num1-num2); // output: 16 instead of 4
return num1 - num2;
break;
}
}

double extract_first_integer(char * input){
char *str = input, *p = str;
double val;
while (*p) { // While there are more characters to process...
if ( isdigit(*p) || ( (*p=='-'||*p=='+') && isdigit(*(p+1)) )) {
// Found a number
val = strtol(p, &p, 10); // Read number
return val;
} else {
// Otherwise, move on to the next character.
p++;
}
}
}

double extract_last_integer(char * input){
char *str = input, *p = str;
double val;
while (*p) { // While there are more characters to process...
if ( isdigit(*p) || ( (*p=='-'||*p=='+') && isdigit(*(p+1)) )) {
// Found a number
val = strtol(p, &p, 10); // Read number
} else {
// Otherwise, move on to the next character.
p++;
}
}
return val;
}

char extract_operand(char * input){
if (strstr(input, "-")) return '-';
}

最佳答案

extract_last_integer() 中你有

while (*p) { // While there are more characters to process...
if ( isdigit(*p) || ( (*p=='-'||*p=='+') && isdigit(*(p+1)) )) {
// Found a number
val = strtol(p, &p, 10); // Read number
} else {
// Otherwise, move on to the next character.
p++;
}
}

增加 p 直到它遇到第一个数字或 -/+ 后跟一个数字。所以它将匹配第一个10 数字。但是请注意,您并没有像 extract_first_integer() 中的早期 return val; 那样打破循环。当您继续匹配下一个数字时,"10-6" 中的 -6 将被匹配。而 10 - (-6) 显然是 16

你也可能有未定义的行为

  • 将相同的指针传递给 strtol。变量 str 未使用,应改为在 str_end 参数中传递
  • const char* ("10-6") 传递给需要 char* 的函数

3 个extract... 函数的性能也不佳,因为它们都需要从输入字符串的开头开始迭代。要解决此问题,您应该返回当前数字的位置并从该位置开始下一个功能。这样你就可以使用相同的函数来解析整数而不是写两个

此外,您的名字倒置了。这两个整数称为 operands连接两个操作数的东西叫做 operator ,不是操作数。为什么只读取整数时返回 double

所以在修复这些点之后我们将拥有

int extract_operand(char * input, size_t *lastChar);
char extract_operator(char * input, size_t *lastChar);

size_t lastPos;
int num1 = extract_operand(input, &lastPos);
char operand = extract_operator(input + lastPos, &lastPos);
int num2 = extract_operand(input + lastPos, &lastPos);

但这只适用于带有 binary operator 的简单情况和 2 个这样的操作数。对于更复杂的情况,您需要 tokenizer将输入流拆分为标记列表

关于计算错误,用+代替-,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57864631/

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