[英]How to tokenize a string using strsep()
我有一個內核模塊,在模塊中,我嘗試使用strsep()
拆分字符串。 我有以下decrypt
變量,其中包含我要拆分的字符串。
unsigned char decrypt[KEY_SIZE];
printk(KERN_DEBUG "%s\n", decrypt);
輸出:
N = D0C2ACDCF780B1E4846054BDA700F18D567247FE8BC5BA4FBCAB814E619DA63A20F65A58EE89FC0824DC9367C5725BDDC596065F1C8868E99C896F3A0CF7D7F0A785E668F2568F19BAFB8FF3BA5CDF487544EFE71010BEDB4EE16EDC3AF0A71391AD3194B42D3FD40B4E0DE12A22D8188AF03FF4E36D37BA1DA1F3C57188E60DA38C25329E48805FC7FF524761A6F010E737B927D8F67383274F8E600167A52A042E1DCA3335150C090803F9D96F6E63BEBFB153516E863F5B4CB02104077834FC5EC31A47451783931D643CE736DD1BAB40C5523858BB067FB9E490DCB5FDBBB03B9D68A8998C1347E237C477AA14B0997A84708CED05A9E24C7072B838F753
E = 010001
D = 21AFE07431CE47269083F8F8B7ABCBCEDA6DCB975457BE6662942C64091586FEE755C9A3832EAA0868665DB507A41A15F1EDF12E44ECF03D0E61111D457D730FA700D0FB0B6C13607C0F5F1DDDEB61AE9019E53A9C998F2AD5924430EEA3E9DA1B0E5F2B575DDBE86C4096B5C87661F7A7E7F7F21D0701509BBA881B4AE463F6F18C7F04AB742319E2D7319EECA136EEB0CF7B2BFA87E3A0E69FBC0E5FDC7EE6271EB2CA09DDBF7C8B57D951762708D76890E62858C1D5FC5B7E40D50913CE7797BD80F6A398FB92703FBDD33FBCB129B86E54F13EC14DA68BE139634DD1E9C01F01751
...
...
我正在使用以下代碼來提取值。 我的目標是在每種情況下獲得N
、 E
、 D
的值。 當我調用這個模塊時,我的機器凍結了。 但是,當我使用gdb
調試循環時,它可以工作。
正如@John Bollinger 所問的那樣,在使用strsep()
之前,我有以下行來使字符串以空值結尾。
size_t lenght = strlen(decrypt);
int N = lenght - 2361; // 2361 is the original size
decrypt[lenght - N] = '\0';
代碼:
char *s3 = decrypt;
int k = 0;
int size = 0;
char *test;
while (s3 != NULL) {
test = strsep(&s3, " ");
test = strsep(&s3, " ");
test = strsep(&s3, "\n");
switch (k) {
case 0:
size = strlen(test);
printk(KERN_DEBUG "token id %d: size %d, token is %s\n", k, size, test);
break;
case 1:
size = strlen(test);
printk(KERN_DEBUG "token id %d: size %d, token is %s\n", k, size, test);
break;
case 2:
size = strlen(test);
printk(KERN_DEBUG "token id %d: size %d, token is %s\n", k, size, test);
break;
........
........
}
k = k + 1;
}
有人可以告訴我,我在這里做錯了什么嗎? 或者是否有任何其他線程安全函數可用於拆分字符串? 提前致謝。
內核版本:Linux 4.15.0-142-generic
有人可以告訴我,我在這里做錯了什么嗎?
我看到你明顯做錯的一件事是在使用它們之前沒有驗證你的結果。 如果輸入的格式不完全符合您的預期,那么test
在進入switch
時很容易為 null,並且代碼似乎沒有預料到這種可能性。
當然,“未完全按照您的預期格式化”也可能意味着有錯誤的期望。 例如,觸發上述空值test
的一種方法是輸入的最后一行以換行符結尾。 在這種情況下, strsep
直到下一個循環才注意到它已經到達字符串的末尾。
此外,這個聲明是可疑的:
unsigned char decrypt[KEY_SIZE];
如果數據的長度可以達到KEY_SIZE
,那么就沒有字符串終止符的空間。 如果您通過strsep()
將其作為字符串處理或通過printk
將其或尾部作為字符串輸出,則必須有一個字符串終止符。 如果數據自然沒有終結符,那么您需要確保添加一個(必須留出空間)。
此外,本身並沒有錯,但很浪費:調用strlen()
,除了最后一個標記。 您可以通過簡單的指針差異獲得彼此令牌的長度: s3 - test - 1
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.