1
我對C有點不熟悉,但我是一名經驗豐富的C++程序員。我在一個函數中遇到了一個問題,我們的教師向我們提供了一個任務,並且我一般查看了有關格式說明符和sscanf的信息,但沒有發現錯誤。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」。我檢查了。
任何人都知道爲什麼會這樣呢?
這是什麼意思的字符數組有一個「非常小的負值」? – 2012-01-27 22:49:09
每當我運行程序時,確切的值都會改變,但在運行時我剛剛做了,當我顯示arg0,arg1和arg2時,這就是我得到的結果(按順序):-2034023152 -2034024160 -2034025168 – user1174511 2012-01-27 22:51:04
我想你忘記了這些是衰減成指針的數組。這些是存儲字符串的內存地址。 (如果你在調用'sscanf'之前查看它們,你會發現它們是相同的 - 它們在內存中的位置沒有改變,但內容有變化。)你需要在數組內查看*。 – 2012-01-27 22:52:03