C中的Sscanf - 没有正确读取某些变量

时间:2012-01-27 22:43:28

标签: c scanf

我对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比arg0小8,arg 2比arg1小8。对于我解析的每一行(总共约10行),这些值都是相同的。

在sscanf发生之前,所有arg变量都等于“\ 0”。我查了一下。

任何人都知道为什么会这样吗?

1 个答案:

答案 0 :(得分:1)

我认为你忘记了这些是衰变成指针的数组。这些是存储字符串的内存地址。 (如果你在调用sscanf之前查看它们,你会发现它们是相同的 - 它们在内存中的位置没有改变但是内容已经改变了。)你需要查看数组内部。 / p>