gpt4 book ai didi

c - 如何区分单位数和多位数作为C中的字符?

转载 作者:行者123 更新时间:2023-11-30 16:12:21 28 4
gpt4 key购买 nike

因此,我正在从标准输入读取输入,并且必须从中计算算术。例如,我可能会得到:

3+4
4+3
7+9

然后将其放入字符数组中,如下所示:

{3+4;4+3;7+9}

我想创建一个程序来接受此输入并返回:

{7;7;16}

由于这是来自 C 中的标准输入,因此每个元素都是 char 类型。我创建了以下代码来处理这样的数组并返回正确的结果:

char *int2string(int i, char *s)
{
sprintf(s, "%d", i);
return s;
}

bufferlen = strlen(buffer);
int result;
for (i = 0; i < bufferlen; i++)
{
if (isNumeric(buffer[i]))
{
value1 = atoi(&buffer[i]);
if (buffer[i + 1] == '+')
{
if (isNumeric(buffer[i + 2]))
{
value2 = atoi(&buffer[i + 2]);
result = value1 + value2;
printf("This is the result: %d\n", result);
int2string(result, &buffer[i]);
for (int k = i + 1; k < bufferlen; k++)
{
buffer[k] = buffer[k + 2];
}
//bufferlen = bufferlen - 2;
}
}
}
}

不幸的是,我的代码仅适用于由一个字符组成的输入,并返回一个只有一个字符的值。如果我运行这个:

34+22

我的代码返回以下内容:

This is the result: 26
322;

我相信发生这种情况是因为我的代码一次只能读取一个字符,并且无法区分单位数字和由多于一位数字组成的数字。有什么办法可以解决这个问题吗?

最佳答案

我认为你的问题在于你正在做类似的事情

value1 = atoi(&buffer[i]);
if (buffer[i + 1] == '+')
...

在此片段中,索引i“指向”您当前正在解析的buffer中的位置。您相信(并且正确地相信)i“指向”一个或多个数字字符中的第一个。您调用atoi将那个/那些数字转换为实际的整数。到目前为止还好。但是然后您测试 buffer[i + 1] 来查看数字后面是否有运算符字符。 这就是不正确的假设产生的地方,即数字总是一位数长。这就是您需要修复的问题,以便正确处理多位数字。

我想说,解决这个问题的最佳方法是使用 strtol 而不是 atoiatoistrtol 之间最明显的区别是 strtol 告诉您它走了多远,使用了多少位数字。它通过向您返回一个指向它未使用的第一个字符的指针来实现此目的。

但这意味着,要使用strtol,您必须显式使用指针。如果使用指针会容易得多

char *p;

单步执行缓冲区,而不是索引i。但你可以这样说

char *endp;
value1 = strtol(p, &endp, 10);
p = endp;
if (*p == '+')
...

其工作方式是,strtolendp 设置为指向它未使用的第一个字符。这就是您想要继续解析的地方,因此您将 p 设置为 endp 并继续。

这里实际发生的是 strtol 接受一个指向指针的指针。如果您还不习惯使用指针,您可能真的还没有准备好考虑指向指针的指针,但是相信我,这可行。

关于c - 如何区分单位数和多位数作为C中的字符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58352487/

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