сохранить отрицательное число в массиве символов (все еще не требуется / желаемое решение) - PullRequest
0 голосов
/ 20 декабря 2010
EDIT:
  platform unix 
  type :  ansi c

У меня есть данные в форме;

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

целое число в диапазоне от -9 до 9

'+ - *' и показывает, что вы должны взять данные, которые лежатв следующей строке

данные являются символом двойного указателя

каждая строка должна храниться в массиве символов двойного указателя

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

когда я беру данные и сохраняю, я не могу достичьсохраните -3 (отрицательное целое число) в данных [i] [j], потому что '-' является символом, поэтому 3 не принимается данными [i] [j]

Что я должен сделать, чтобы решить эту проблему?

РЕДАКТИРОВАТЬ: МОЙ код;

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 ]

2 голосов
/ 20 декабря 2010

Я считаю, что ключом здесь является использование ограниченного диапазона ваших входных значений. Поскольку ваши входные числа будут только однозначными целыми числами, найдите несколько невозможных входных значений и зарезервируйте их для операторов. Например, вы можете присвоить 64 значение «+», 65 - «-» и т. Д. Используйте strtol() для считывания чисел по одному, затем проверьте их и убедитесь, что они попадают в указанный вами диапазон и приведите их до полукокса Если вы видите оператор без присоединенного к нему номера, преобразуйте его в соответствующее зарезервированное значение (для функций более чистого кода сделайте функции «encode_operator» и «decode_operator») и сохраните его.

Недостатком этого метода является то, что вы не можете слепо использовать сохраненное значение как число. Когда вы извлекаете данные из массива, вам нужно будет проверить каждое значение, чтобы увидеть, является ли оно оператором или числом. В вашем случае простой макрос #IS_OPERATOR(x) ((x < -9) || (x > 9)) сможет сделать это за вас.

1 голос
/ 20 декабря 2010

Если вы уверены, что целые числа находятся в диапазоне от -9 до 9, и хотите сохранить их в символах по отдельности, есть хитрость, хотя и требуется больше вычислений чисел., ..., 8, 9} в {0, 1, ..., 17, 18}, минус -9 для каждого числа.В настоящее время у вас есть все неотрицательные целые числа, так что делайте, что хотите.Во время выполнения вы должны преобразовать данные, сохраненные в исходное значение, добавив -9.

0 голосов
/ 20 декабря 2010

Вместо этого вы можете использовать массив Union.

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

Затем создайте массив из ABC.

0 голосов
/ 20 декабря 2010
char '2' != int 2

почему бы не использовать вместо него

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

?Используя

scanf("%c", &ch);

, вы читаете только один символ ASCII, который может быть пробелом, знаком минус или цифрой.

РЕДАКТИРОВАТЬ: после просмотра таблицы ASCII , / символ с кодом 0x2F будет переводиться в -1 тогда это читается следующим образом:

char c; 
scanf("%c", &c);
data[i][j] = c - '0'; // 0x2F - 0x30 == -1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...