[英]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 * strtok ( char * 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.