我对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”。我查了一下。
任何人都知道为什么会这样吗?
答案 0 :(得分:1)
我认为你忘记了这些是衰变成指针的数组。这些是存储字符串的内存地址。 (如果你在调用sscanf
之前查看它们,你会发现它们是相同的 - 它们在内存中的位置没有改变但是内容已经改变了。)你需要查看数组内部。 / p>