簡體   English   中英

如何使用 strsep() 標記字符串

[英]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
...
...

我正在使用以下代碼來提取值。 我的目標是在每種情況下獲得NED的值。 當我調用這個模塊時,我的機器凍結了。 但是,當我使用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.

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