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/
答案 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数组。