簡體   English   中英

調用strtok()時訪問沖突 C ++

[英]Access violation when calling strtok(); C++

我在這段代碼上遇到了麻煩:

char KernelFS::doesExist(char* fname){
    char part;
    char name[8];
    char ext[3];

    char* token;

    token = strtok(fname, "\\");
    strncpy(&part, token, 1);

    token = strtok(fname, "\\");
    strncpy(name, token, 8);

    token = strtok(fname, "\\");
    strncpy(ext, token, 3);

    return 0;
}

當我在strtok(...)的第一次調用中運行它時,它將編譯並中斷-訪問沖突寫入位置...不知道為什么:(

我稱這個功能為:

KernelFS :: doesExist(“ X:\\ test.exe”);

關鍵是將fname char數組分為3個數組; 一個用於分區的名稱,一個用於文件名,一個用於文件擴展名;

謝謝您的幫助 ! :)

在您的示例中:

KernelFS::doesExist("X:\test.exe");

"X:\\test.exe"實際上是const char*類型,您不能修改它。 該原始字符串文字分配在受保護的內存區域內,因此會遇到錯誤。

char * strtokchar * str,const char *分隔符);

STR -注意,這串通過被破碎成較小的字符串(令牌) 改性 可替代地,可以指定空指針,在這種情況下,該函數繼續掃描,而先前對該函數的成功調用結束了。

如果確實要使用<cstring>庫(盡管不建議使用),則應該將字符串分配在堆棧上,而不是從程序符號的區域中獲取它。

char path[] = { "X:\\test.exe" };
KernelFS::doesExist(path);

但是,建議您切換到<string>庫。

我建議進行以下修改:

char KernelFS::doesExist(char* fname)
{
    // Our variables.
    char part[2];
    char name[9];
    char ext[4];        
    char* token;

    // Initialize variables.
    memset(part, '\0', 2);
    memset(name, '\0', 9);
    memset(ext, '\0', 4);

    // If we receive an invalid string:
    if (fname == NULL)
        return -1; // Return error.

    // Process.
    if ((token = strtok(fname, "\\")) != NULL)
        strncpy(part, token, 1);
    if ((token = strtok(fname, "\\")) != NULL)
        strncpy(name, token, 8);
    if ((token = strtok(fname, "\\")) != NULL)
        strncpy(ext, token, 3);

    // If we retrieved the 3 variables:
    if (strlen(part) > 0 && strlen(name) > 0 && strlen(ext) > 0)
    {
        // Do something with part, name and ext here.
    }

    // Return success.
    return 0;
}

正如Piotr S.所說,請注意使用有效的char *調用此函數 (而不是const char *或其他任何const char * )。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM