在char数组中存储负数(仍然没有必需/期望的解决方案)

时间:2010-12-20 06:24:14

标签: c++ c algorithm compression user-input

EDIT:
  platform unix 
  type :  ansi c

我有表格中的数据;

1 2 3 -1 2 -9 1 3 + 
-1 2 -3 -4 -
*

介于-9和9之间的整数

'+ - *'运算符并显示您应该获取位于以下行的数据

数据是char双指针

每行必须存储在双指针char数组

example :   data[0] :=>  1 2 3 -1 2 -9 1 3 + 
            more precisely :  data[0][3] must store -1 

当我拿数据和存储时,我无法在数据[i] [j]中实现存储-3(负整数) 因为' - '是一个字符所以数据[i] [j]

不接受3

我该怎么办才能解决这个问题?

编辑:我的代码;

size_t datalen = sizeof( char ) ;

data = ( char ** ) malloc( sizeof (char * ) ) 
for ( i = 0 ;   ; ++i ) 
   data[i] = (char * ) malloc ( datalen )
   for ( j = 0 ;  ; ++ j )
         signed char ch;
         if j !=  0 
            datalen += 1
            data[i] = ( char * ) realloc ( begin[i], datalen )
         scanf ("%c ", &ch ) 
         begin[i][j] = ch 
         if ch == OP ( op = + , - , * , / )
             break
   if strlen ( begin[i] ) == 1 
           break

编辑:      如果你看一下ascii表,你就会明白我为什么不使用scanf(“%d”,& ch)      http://www.asciitable.com/

4 个答案:

答案 0 :(得分:2)

我认为这里的关键是利用有限的输入值范围。由于您的输入数字只是单位数整数,因此找到几个不可能的输入值并为操作员保留它们。例如,你可以让64为'+',65为' - '等。使用strtol()一次读取一个数字,然后验证它们并确保它们落在你指定的范围内把它们归结为一个炭。如果您看到没有附加数字的运算符,请将其转换为适当的保留值(make'coding_operator'和'decode_operator'函数以获得更清晰的代码)并存储它。

此方法的缺点是您不能盲目地将存储的值用作数字。从数组中提取数据时,您必须检查每个值以查看它是运算符还是数字。在您的情况下,一个简单的#IS_OPERATOR(x) ((x < -9) || (x > 9))宏应该能够为您执行此操作。

答案 1 :(得分:1)

如果您确定整数介于-9和9之间,并希望将它们分别存储在char中,那么有一个技巧,但包括更多数字计算。

将{-9,-8,...,8,9}映射到{0,1,...,17,18},每个数字最少使用-9。这时,你有所有非负整数,所以做你想要的。在运行时,您应该通过添加-9。将数据转换为原始值。

答案 2 :(得分:0)

char '2' != int 2

为什么不使用

int tmp; 
scanf("%d", &tmp);
data[i][j] = tmp;

代替?使用

scanf("%c", &ch);

您只读取一个ASCII字符,可以是空格,减号或数字。

编辑:咨询ASCII table后,代码为0x2F的/字符将转换为-1 iff 以这种方式读取:

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

答案 3 :(得分:0)

您可以使用Union数组。

typedef union
{
  int num;
  char op;
} ABC;

然后制作ABC数组。