gpt4 book ai didi

c - 求解缓冲区中的表达式

转载 作者:太空宇宙 更新时间:2023-11-04 03:04:54 24 4
gpt4 key购买 nike

我正在尝试创建一个函数(在 C 中)来解决放置在缓冲区变量中的加法问题。到目前为止,它适用于产生个位数的方程式,但是如果结果超过一位数,就会出现问题。例如,如果我将 2+3+5+2 放入缓冲区,输出 102,而不是12. 谁能指出我的错误在哪里以及我该如何改正?

这是我的代码:

char buffer[50];

void *adder(void)
{
int bufferlen;
int value1, value2;
int startOffset, remainderOffset;
int i;
char result[10];
while (1)
{
startOffset = remainderOffset = -1;
value1 = value2 = -1;

bufferlen = strlen(buffer);
for (i = 0; i < bufferlen; i++) {
if(value1 == -1)
{
if(isNumeric(buffer[i]))
{
value1 = string2int(&buffer[i]);
startOffset = i;
}
}
else
{
if(buffer[i] == 43)
{
if(isNumeric(buffer[i+1]))
{
value2 = string2int(&buffer[i+1]);
remainderOffset = i+1;
}
}
}

if(value1 != -1 && value2 != -1)
{
int k=0;
int j=0;
int2string((value1 + value2),result);
/* print out the number we've found */
fprintf(stdout, "Re:%s\n", result);
int resultlen = strlen(result);
for(k=startOffset; k < bufferlen; k++)
{
if(j < resultlen)
{
buffer[k] = result[j];
j++;
}
else
{
/* shift the remainder of the string to the left */
printf("A1-Buffer:%s\nk=%i\n", buffer, k);
if(j > 0)
buffer[k] = buffer[k+2];
else
buffer[k] = buffer[k+2];
printf("A2-Buffer:%s\n", buffer);
i = i - remainderOffset;
startOffset = remainderOffset = -1;
value1 = value2 = -1;
}
}
}
}
break;
}

}

编辑 啊,抱歉,忘了额外的功能了。此函数用于学校作业,isNumeric() 和 String2int() 与 isdigit() 和 atoi() 完全相同,并提供给我们在函数中使用。

编辑 2: 添加数字后,必须将结果添加回表达式位置的缓冲区中,如下所示:(2+3) -> (5) 原因是最终将编写更多函数来处理乘法、除法等。这是我主要的挫败感所在 - 将结果放在表达式的位置并将缓冲区左移适当的量。

最佳答案

char buffer[50];

为什么是 50 字节?为什么不是 100?你应该接受一个指针作为参数而不是依赖一个全局的。此外,buffer 不是一个描述性名称。

void *adder(void)

该函数不返回void *;它没有返回值。你可能会考虑

/* return value of expression */
int evaluate_add_expression( char const *in_string )

/* return status code */
int evaluate_add_expression( char const *in_string, int *out_value )

接下来,您声明了一些变量但没有对其进行初始化。将声明移到循环中,并在声明中包含初始化,即 int value1 = -1, value2 = -1; 当然,这些名称也完全没有描述性。

            if(buffer[i] == 43)

'+' 是表示加号字符的一种比魔数(Magic Number) 43 更好的方式。


如果我是你,我会利用 sscanf 函数。

int evaluate_add_expression( char const *in_string, int *sum ) {
int addend;
size_t offset, offset_delta;

if ( sscanf( in_string, " %d %zn", sum, &offset ) != 1 ) return 1;

while ( sscanf( in_string + offset, "+ %d %zn", &addend, &offset_delta ) == 1 ) {
* sum += addend;
offset += offset_delta;
}

return in_string[ offset ] != '\0'; /* check that all input was consumed */
}

这很好用,大约是原来的 15%。

关于c - 求解缓冲区中的表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6587923/

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