Sscanf в C - не читает правильно некоторые переменные - PullRequest
1 голос
/ 28 января 2012

Я немного неопытен с C, но я опытный программист C ++. Я столкнулся с проблемой в функции, которую наш инструктор предоставил нам для назначения, и я просмотрел информацию о спецификаторах формата и sscanf в целом и не нашел ошибку.

Проблема в этой части функции, хотя я также добавлю объявления для соответствующих строк:

char label[MAXLINELENGTH], opcode[MAXLINELENGTH], arg0[MAXLINELENGTH],
arg1[MAXLINELENGTH], arg2[MAXLINELENGTH];

А потом внутри функции:

int readAndParse(FILE *inFilePtr, char *label, char *opcode, char *arg0,
         char *arg1, char *arg2)
{
   char line[MAXLINELENGTH];
   char *ptr = line;

  /* delete prior values */
  label[0] = opcode[0] = arg0[0] = arg1[0] = arg2[0] = '\0';

  /* read the line from the assembly-language file */
  if (fgets(line, MAXLINELENGTH, inFilePtr) == NULL) {
    /* reached end of file */
    return(0);
  }

  /* check for line too long (by looking for a \n) */
  if (strchr(line, '\n') == NULL) {
    /* line too long */
    printf("error: line too long\n");
    exit(1);
  }
  /* is there a label? */
  ptr = line;
  if (sscanf(ptr, "%[^\t\n ]", label)) {
    /* successfully read label; advance pointer over the label */
    ptr += strlen(label);
  }

  /*
   * Parse the rest of the line.  Would be nice to have real regular
   * expressions, but scanf will suffice.
   */
  **sscanf(ptr, "%*[\t\n ]%[^\t\n ]%*[\t\n ]%[^\t\n ]%*[\t\n ]%[^\t\n ]%*[\t\n ]%\
[^\t\n ]", opcode, arg0, arg1, arg2);**

Это еще не все, но проблема заключается в жирной функции. После этого я распечатал все переменные, которые должны были быть извлечены (плюс метка, которая была прочитана выше), и только метка и код операции прочитали. Arg0, arg1 и arg2 - все очень маленькие отрицательные значения. Если это помогает, arg1 на 8 меньше, чем arg0, а arg 2 на 8 меньше, чем arg1. Эти значения одинаковы для каждой строки, которую я анализирую (всего около 10 строк).

Все переменные arg равны "\ 0" до того, как произойдет sscanf. Я проверил.

Кто-нибудь знает, почему это происходит?

1 Ответ

1 голос
/ 28 января 2012

Я думаю, вы забыли, что это массивы, которые распадаются на указатели. Это адреса памяти, по которым хранятся строки. (Если вы посмотрите на них перед вызовом sscanf, вы увидите, что они одинаковы - их расположение в памяти не изменилось, но содержимое изменилось.) Вам нужно заглянуть в массив.

...