2012-01-27 74 views
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」。我檢查了。

任何人都知道爲什麼會這樣呢?

+0

這是什麼意思的字符數組有一個「非常小的負值」? – 2012-01-27 22:49:09

+0

每當我運行程序時,確切的值都會改變,但在運行時我剛剛做了,當我顯示arg0,arg1和arg2時,這就是我得到的結果(按順序):-2034023152 -2034024160 -2034025168 – user1174511 2012-01-27 22:51:04

+0

我想你忘記了這些是衰減成指針的數組。這些是存儲字符串的內存地址。 (如果你在調用'sscanf'之前查看它們,你會發現它們是相同的 - 它們在內存中的位置沒有改變,但內容有變化。)你需要在數組內查看*。 – 2012-01-27 22:52:03

回答

1

我想你忘記了這些是衰減成指針的數組。這些是存儲字符串的內存地址。 (如果您在致電sscanf之前查看它們,您會看到它們是相同的 - 它們在內存中的位置沒有改變,但內容有變化。)您需要查看陣列內部。