如何区分单位数字和多位数字作为 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
而不是 atoi
。 atoi
和 strtol
之间最明显的区别是 strtol
告诉你它走了多远,它使用了多少位数。它通过向您返回指向它未使用的第一个字符的指针来执行此操作。
不过,这意味着要使用 strtol
,您将必须明确使用指针。如果用指针的话会容易很多
char *p;
单步执行 buffer
,而不是索引 i
。但是你可以这样说
char *endp;
value1 = strtol(p, &endp, 10);
p = endp;
if (*p == '+')
...
其工作方式是,strtol
将 endp
设置为指向它未使用的第一个字符。那是您要继续解析的地方,因此您将 p
设置为 endp
并继续。
这里实际发生的是 strtol
接受一个 指向一个指针 的指针。如果您还不习惯使用指针,您可能真的还没有准备好考虑指针指向指针,但相信我,这是可行的。
所以,我正在读取来自标准输入的输入,我必须从中计算算术。例如,我可能会得到:
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
而不是 atoi
。 atoi
和 strtol
之间最明显的区别是 strtol
告诉你它走了多远,它使用了多少位数。它通过向您返回指向它未使用的第一个字符的指针来执行此操作。
不过,这意味着要使用 strtol
,您将必须明确使用指针。如果用指针的话会容易很多
char *p;
单步执行 buffer
,而不是索引 i
。但是你可以这样说
char *endp;
value1 = strtol(p, &endp, 10);
p = endp;
if (*p == '+')
...
其工作方式是,strtol
将 endp
设置为指向它未使用的第一个字符。那是您要继续解析的地方,因此您将 p
设置为 endp
并继续。
这里实际发生的是 strtol
接受一个 指向一个指针 的指针。如果您还不习惯使用指针,您可能真的还没有准备好考虑指针指向指针,但相信我,这是可行的。