C++ 在字符数组中存储负数(仍然没有需要/需要的解决方案)

C++ 在字符数组中存储负数(仍然没有需要/需要的解决方案),c++,c,algorithm,compression,user-input,C++,C,Algorithm,Compression,User Input,我有表格中的数据 EDIT: platform unix type : ansi c 介于-9和9之间的整数 “+-*”运算符,并显示应获取位于下一行的数据 数据是双指针字符 每行必须存储在双指针字符数组中 1 2 3 -1 2 -9 1 3 + -1 2 -3 -4 - * 当我获取数据并存储时,我无法在数据[I][j]中实现存储-3(负整数) 因为“-”是一个字符,所以数据[i][j]不接受3 我该怎么处理这个问题 编辑:我的代码 example : data[0] :

我有表格中的数据

EDIT:
  platform unix 
  type :  ansi c
介于-9和9之间的整数

“+-*”运算符,并显示应获取位于下一行的数据

数据是双指针字符

每行必须存储在双指针字符数组中

1 2 3 -1 2 -9 1 3 + 
-1 2 -3 -4 -
*
当我获取数据并存储时,我无法在数据[I][j]中实现存储-3(负整数) 因为“-”是一个字符,所以数据[i][j]不接受3

我该怎么处理这个问题

编辑:我的代码

example :   data[0] :=>  1 2 3 -1 2 -9 1 3 + 
            more precisely :  data[0][3] must store -1 
编辑: 若你们看一下ascii表,你们就会明白为什么我不使用scanf(“%d”,&ch)

为什么不使用

char '2' != int 2
相反?利用

int tmp; 
scanf("%d", &tmp);
data[i][j] = tmp;
您只读取一个ASCII字符,可以是空格、减号或数字

编辑:咨询后,代码为0x2F的
/
字符将转换为
-1
iff,其读取方式如下:

scanf("%c", &ch);
为什么不使用

char '2' != int 2
相反?利用

int tmp; 
scanf("%d", &tmp);
data[i][j] = tmp;
您只读取一个ASCII字符,可以是空格、减号或数字

编辑:咨询后,代码为0x2F的
/
字符将转换为
-1
iff,其读取方式如下:

scanf("%c", &ch);

可以改用联合数组

char c; 
scanf("%c", &c);
data[i][j] = c - '0'; // 0x2F - 0x30 == -1

然后创建ABC数组。

您可以使用联合数组代替

char c; 
scanf("%c", &c);
data[i][j] = c - '0'; // 0x2F - 0x30 == -1

然后创建ABC数组。

我认为这里的关键是利用有限的输入值范围。由于您的输入数字将仅为一位数整数,请查找几个不可能的输入值,并将它们保留给运算符。例如,可以让64为“+”,65为“-”,等等。使用
strtol()
一次读入一个数字,然后验证它们,确保它们在指定的范围内,并将它们转换为字符。如果您看到一个运算符没有附加数字,请将其转换为相应的保留值(使用“encode_operator”和“decode_operator”函数以获得更清晰的代码)并将其存储


这种方法的缺点是不能盲目地将存储的值用作数字。从数组中提取数据时,必须检查每个值,以确定它是运算符还是数字。在您的例子中,一个简单的
#IS_运算符(x)((x<-9)| |(x>9))
宏应该可以为您完成这项工作。

我相信这里的关键是利用有限的输入值范围。由于您的输入数字将仅为一位数整数,请查找几个不可能的输入值,并将它们保留给运算符。例如,可以让64为“+”,65为“-”,等等。使用
strtol()
一次读入一个数字,然后验证它们,确保它们在指定的范围内,并将它们转换为字符。如果您看到一个运算符没有附加数字,请将其转换为相应的保留值(使用“encode_operator”和“decode_operator”函数以获得更清晰的代码)并将其存储


这种方法的缺点是不能盲目地将存储的值用作数字。从数组中提取数据时,必须检查每个值,以确定它是运算符还是数字。在您的例子中,一个简单的
#IS_运算符(x)((x<-9)| |(x>9))
宏应该可以为您完成这项工作。

如果您确定整数的范围在-9和9之间,并且希望将它们单独存储在一个字符中,那么有一个技巧,尽管还包括更多的数字计算


将{9,-8,…,8,9}映射到{0,1,…,17,18},每个数字减去-9。此时,您拥有所有非负整数,因此可以执行您想要的操作。在运行时,您应该通过添加-9将存储的数据转换为其原始值。

如果您确定整数的范围在-9和9之间,并且希望将它们单独存储在一个字符中,那么有一个技巧,尽管还包括更多的数字计算


将{9,-8,…,8,9}映射到{0,1,…,17,18},每个数字减去-9。此时,您拥有所有非负整数,因此可以执行您想要的操作。在运行时,您应该通过添加-9将存储的数据转换为其原始值。

发布一些代码?请注意,
char
的符号是由实现定义的。您的错误是什么?确保您使用的是带符号的字符。对于C99,您可以使用“%hhd”直接读取SCHAR_MIN到SCHAR_MAX范围内的值。否则,将scanf转换为int并复制到char。作为ughoavgfhw推荐,请确保您使用的是
签名字符
,而不是普通字符。是否发布一些代码?请注意,
char
的符号是由实现定义的。您的错误是什么?确保您使用的是带符号的字符。对于C99,您可以使用“%hhd”直接读取SCHAR_MIN到SCHAR_MAX范围内的值。否则,将scanf转换为int并复制到char。正如ughoavgfhw建议的那样,请确保您使用的是
有符号字符
,而不是纯字符。如果使用scanf(“%d”,ch)”,/在数据[i][j]中将等于-1,或者在我尝试使用这些数字和运算符时,由于ASCIBUT的原因,我将遇到新问题,无论“/”是否为-1,如果要将数字存储为数字,则不能将数字和运算符符号存储在同一数组中。这是因为一个数组存储多个相同类型的对象,而数字与运算符符号的类型不同。您可以将它们全部存储为某种联合类型的实例,如chanchal1987所示。但这可能不是你真正想做的。你到底想干什么?您认为为什么要将这些值存储在数组中?下一步你打算如何处理数组值?@Karl:这就是为什么我“放弃”了对这个答案的支持。如果使用scanf(“%d”,ch),/在数据[I][j]中等于-1,或者在我尝试使用这些数字和运算符时,由于ascibit的原因,我会遇到新问题,无论“/”是否为-1,如果要将数字存储为数字,则不能将数字和运算符符号存储在同一数组中。Th