2011-12-01 46 views
7

我的功能foo(char *str)收到str這是一個多行字符串,其中包含以空終止的新行字符。我正在嘗試編寫一個循環遍歷字符串並在一行上運行。什麼是實現這一目標的好方法?什麼是循環多行字符串中行的好方法?

void foo(char *str) { 
    while((line=getLine(str)) != NULL) { 
     // Process a line 
    } 
} 

我需要實現我自己getLine還是有一個內置功能,爲我做到這一點?

+1

有一個內置的getline,但它不是你想要的。它用於從文件中一次獲取一行。 – Kevin

回答

2

您需要根據自己的新行字符來實現某種解析。帶有「\ n」分隔符的strtok()是一個非常不錯的選項,可以執行類似於您所尋找的內容的任務,但必須與示例略有不同。它會更像:

char *tok; 
char *delims = "\n"; 
tok = strtok(str, delims); 

while (tok != NULL) { 
    // process the line 

    //advance the token 
    tok = strtok(NULL, delims); 
} 

但是,您應該注意,strtok()既是破壞性的,也不是線程安全的。

1

我想你可能會使用strtok,該標記化的字符串到一些特定的字符分隔的數據包,你的情況換行符:

void foo(char *str) 
{ 
    char *line = strtok(str, "\n"); 
    while(line) 
    { 
     //work with line, which contains a single line without the trailing '\n' 
     ... 

     //next line 
     line = strtok(NULL, "\n"); 
    } 
} 

但請記住,這改變了str內容(它實際上用'\0' s取代'\n' s),所以如果您需要更進一步,您可能需要事先製作它的副本。

0

您可以使用fgetsgetLine工作:http://linux.die.net/man/3/fgets

+0

他想從字符串而不是文件讀取行。我不確定C是否有串流。 –

+0

@ChristianRau C沒有'stringstream's,但它確實有'fgets',它不使用它們。但是,你說的正確的是OP想要一個字符串而不是一個文件。 – Kevin

+0

@Kevin我只是認爲可能有一種方法可以爲字符串創建文件描述符,這將是字符串流的C路。 –

1

的sooo ...有點晚了,但下面是@ debeer的和@Christian勞的回答可重入版本 - 注意strtok_r代替strtok。 這可以使用不同的字符串從多個線程中調用。

char *tok; 
char *saveptr; 
char *delims = "\n"; 
tok = strtok_r(str, delims, &saveptr); 

while (tok != NULL) { 
    // process the line 

    //advance the token 
    tok = strtok_r(NULL, delims, &saveptr); 
} 

請注意,它仍然具有破壞性,因爲它修改了被標記化的字符串。

相關問題