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

How to differentiate between single digit numbers and multiple digit numbers as chars in C?

所以,我正在读取来自标准输入的输入,我必须从中计算算术。例如,我可能会得到:

3+4
4+3
7+9

然后将其放入这样的字符数组中:

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

我想创建一个接受此输入的程序 return:

{7;7;16}

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

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;
                    }
                }
            }
        }

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

34+22

我的代码return如下:

This is the result: 26
322;

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

您可以使用 sscanf 来获取运算符和任意数字。您可以按如下方式使用它:

int sum, len;
sscanf(buffer, "%d%n", &sum, &len); // get the first number

int number;
char op;

buffer += len;

// then pattern is: "operation""number"
while(sscanf(buffer, "%c%d", &op, &number) == 2) // while you can scan both operation and number
{
    if (op == '+')
        sum += number;
    else if (op == '-')
        sum -= number;
    ...
}

关于 sscanf 的更多信息 here

你的问题,我想,是你在做这样的事情

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

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

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

不过,这意味着要使用 strtol,您将必须明确使用指针。如果用指针的话会容易很多

char *p;

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

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

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

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