2014-03-05 50 views
1

以下幾行代碼給了我一個分段錯誤。這些寄存器是:inputPtr = 00 PRNT 02(來自stdin的正確輸入)fgets後,inputPtr = 00後第一個strtok()和inputPtr =(null)後第二個strtok()使用strtok()將字符串拆分爲3部分

if/else with return 3;是一個錯誤檢查。

問題據我所知,它是第二次調用strtok()不在PRNT中讀取,所以我得到爲什麼段錯誤發生。我真的很希望能夠閱讀PRNT。 有一點幫助會很棒!謝謝!

fgets(input, 15, stdin); 
    /*Tokenize instr00 into "00"(instructionCounter) "INST"(operationCode) and "OP"(operand)*/ 
    if(atoi(strtok(inputPtr, " ")) >= 0 && atoi(strtok(inputPtr, " ")) <= 99) 
    { 
     *instructionCounter = atoi(strtok(inputPtr, " ")); 
    } 
    else 
    { 
     return 3; 
    } 
    inputPtr = strtok(NULL, " "); 
+1

是吧'與fgets(輸入,15,標準輸入);'或'與fgets(inputPtr,15,標準輸入);' –

回答

1

strtok意味着比你使用的是不同的方式使用。下面是C++ Reference一些文檔:

在第一個呼叫,該函數需要使用C字符串作爲參數的STR,其第一個字符作爲起始位置掃描令牌。 在隨後的調用中,函數需要一個空指針,並將最後一個標記結束後的位置作爲新的掃描起始位置。

試試這個:

#include <stdio.h> 
#include <string.h> 

int main() 
{ 
    // fgets(input, 15, stdin); 

    char input[20]; // = "00 PRNT 02"; 
    char* firstToken = NULL; 
    char* secondToken = NULL; 
    char* thirdToken = NULL; 
    int instructionCounter = 0; 

    strcpy(input, "00 PRNT 02"); 
    firstToken = strtok(input, " "); 
    secondToken = strtok(NULL, " "); 
    thirdToken = strtok(NULL, " "); 
    instructionCounter = atoi(firstToken); 

    fprintf(stdout, "First token: %s\n", firstToken); 
    fprintf(stdout, "Second token: %s\n", secondToken); 
    fprintf(stdout, "Third token: %s\n", thirdToken); 
    fprintf(stdout, "Instruction Counter: %d\n", instructionCounter); 

    return 0; 
} 
+0

什麼是'C+++'? – zoska

1

讓我們做下面的測試。

fgets(inputPtr, 15, stdin); 

現在inputPtr具有值"00 PRNT 02"現在使用的strtok抓取 「00」

char *p = strtok(inputStr," "); 

printf("%s",p)現在給出"00"作爲輸出。

是否strtok爲「00」分配新內存並返回地址給p? 答案是NO。它只返回指向第一個字符的指針,並將其內部指針移到下一個標記的開始位置。所以下次調用strtok(NULL," ")時,它會從該內部指針開始。

所以p指向inputPtr的第一個字符。但是printf會打印字符串直到遇到空字符'\0'。所以"00"後面跟着空字符p。但由於p指向inputStr,所以在inputStr也發生同樣的情況。

因此,在第一個strtok之後,系統會用空字符替換"00"後的初始" "(空格)。

您可以使用以下命令序列檢查它。

char *p = strtok(inputStr," "); 
printf("%s",p); //output is "00" 
printf("%s",inputStr); // output is "00" 

所以當你做p = strtok(inputStr," ");第二次,你是令牌化字符串"00"只,而不是"00 PRNT 02",因此你沒有得到PRNT打印。不要再次調用它。 Imporved代碼如下。

fgets(inputPtr, 15, stdin); 

int a = atoi(strtok(inputPtr, " ")); 
if(a >= 0 && a <= 99) 
{ 
    *instructionCounter = a; 
} 
else 
{ 
    return 3; 
} 
inputPtr = strtok(NULL, " "); 
相關問題