您几乎已经完成了,您的代码的问题是运算符的打印。 %s 正在尝试打印一个以空字符结尾的字符串并需要一个内存地址。您正在传递一个字符+,这可能是您系统上的 ascii,因此变成内存地址 43
我已将 printf 语句更改为打印一个字符与一个以空字符结尾的字符串,它也可以按您的预期工作
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
char str[] = "222+333";
char *endPtr;
long int x = strtol(str, &endPtr, 10);
printf("Number is %d \n", x);
printf("Operator is %c \n", *endPtr);
long int y = strtol(endPtr, &endPtr, 10);
printf("Number is %d\n", y);
return 0;
}
要回答评论问题,endPtr 不是指向3,而是指向+,这对于 strtol 读取即正数是有效的,当您将符号更改为除或乘时它会失败(应该与减号一起使用)
您需要做的是将 endPtr 提前 1 个字符超过它所指向的运算符,如下面的代码所示
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
char str[] = "222/333";
char *endPtr;
char theOperator= ' ';
long int x = strtol(str, &endPtr, 10);
printf("Number is %d \n", x);
theOperator= *endPtr;
++endPtr;
printf("Operator is %c \n", theOperator);
long int y = strtol(endPtr, &endPtr, 10);
printf("Number is %d\n", y);
return 0;
}