2013-10-15 56 views
0

我試圖解析以下字符串:字符串解析基於轉義字符

"USBSTOR\DISK&VEN_JETFLASH&PROD_TRANSCEND_8GB&REV_1100\00H8096XQ9UW1BQ5&0:JetFlash Transcend 8GB USB Device" 

基於'\'(人物)

習題1:但這個人物被視爲轉義字符

問題2:\0在字符串的中間被認爲是字符串的結尾。

我嘗試了很多方法。

(i)我試圖用替換另一個字符,如'$',並試圖用sscanf()解析,但它不起作用。

你能提供一些建議嗎?

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

int main() 
{ 
    char str[80] = "This is \www.tutorialspoint.com \website"; 
    const char s[2] = "\\"; 
    char *token; 

    /* get the first token */ 
    token = strtok(str, s); 

    /* walk through other tokens */ 
    while(token != NULL) 
    { 
     printf(" %s\n", token); 

     token = strtok(NULL, s); 
    } 

    return(0); 
} 
+1

使用[strtok](http://pubs.opengroup.org/onlinepubs/009695299/functions/strtok.html)而不是'sscanf' –

+0

反斜槓只是* literal *字符串中的轉義字符,即字符串從字面上寫在源代碼中。從輸入(用戶,文件,網絡)中讀取的字符串不會*反斜槓作爲「轉義」字符。 –

+0

它是*值*零(ASCII代碼爲零的字符,又名*文字*字符''\ 0''),它是一個字符串終止符。在一個字符串中,字符序列「'\'」後跟「0」不是字符串終結符。 –

回答

1

使此修改 char str[80] = "This is \\www.tutorialspoint.com \\website";

就這樣,你的輸出是:

This is 
www.tutorialspoint.com 
website 

記住:文字,你在代碼中使用任何字符串需要反斜槓轉義序列。

+0

:如何修改.. –

+0

這僅適用於字符串文本(即您在右側使用的常量字符串)。您需要使用\\而不是\。 – Raja

+1

拉哈夫,問題是在字符串中使用''\\ –

1

切記轉義序列(\\,\n,\0等)是單個字符。

要在代碼本身初始化的字符串中有\字符,必須在初始化字符串中使用\\

如果你在運行時提供輸入,那麼你應該使用\(單反斜線)輸入,提供輸入這樣不會考慮\0爲ASCII-0字符,而是將被視爲\其次0 (兩個字符)。

在你的情況,要分析「USBSTOR \ d ...」,您可以通過提供作爲輸入的形式做,在無論是將其存儲在一個字符串const(記住\\在這種情況下)或控制檯或磁盤文件(這裏您應該使用單個\)。

以上述任何一種方式,當您閱讀字符串時,您將獲得預期的正確字符,例如,對於第一種情況,當您閱讀或打印它時,\\將解析爲\

+0

:但是,當它與它得到\ 0,那麼它會認爲該字符串的結尾... –

+0

沒有它不會!每個人都是獨立的角色。 '\ 0'是單個字符。 「blah \ 0blah」包含10個字符。 – Raja

+0

@RaghavGuar:字符串的結尾是ASCII-0值的字符,它不可打印,因此它在C中用'\ 0'表示。現在,如果你正在通過char讀取一個字符串char,並且你得到了兩個字符'\'和'0'的序列,那不會表示字符串的結尾,那就是兩個字符。 –