我的功能foo(char *str)
收到str
這是一個多行字符串,其中包含以空終止的新行字符。我正在嘗試編寫一個循環遍歷字符串並在一行上運行。什麼是實現這一目標的好方法?什麼是循環多行字符串中行的好方法?
void foo(char *str) {
while((line=getLine(str)) != NULL) {
// Process a line
}
}
我需要實現我自己getLine
還是有一個內置功能,爲我做到這一點?
我的功能foo(char *str)
收到str
這是一個多行字符串,其中包含以空終止的新行字符。我正在嘗試編寫一個循環遍歷字符串並在一行上運行。什麼是實現這一目標的好方法?什麼是循環多行字符串中行的好方法?
void foo(char *str) {
while((line=getLine(str)) != NULL) {
// Process a line
}
}
我需要實現我自己getLine
還是有一個內置功能,爲我做到這一點?
您需要根據自己的新行字符來實現某種解析。帶有「\ 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()既是破壞性的,也不是線程安全的。
我想你可能會使用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),所以如果您需要更進一步,您可能需要事先製作它的副本。
您可以使用fgets
做getLine
工作:http://linux.die.net/man/3/fgets
他想從字符串而不是文件讀取行。我不確定C是否有串流。 –
@ChristianRau C沒有'stringstream's,但它確實有'fgets',它不使用它們。但是,你說的正確的是OP想要一個字符串而不是一個文件。 – Kevin
@Kevin我只是認爲可能有一種方法可以爲字符串創建文件描述符,這將是字符串流的C路。 –
的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);
}
請注意,它仍然具有破壞性,因爲它修改了被標記化的字符串。
有一個內置的getline,但它不是你想要的。它用於從文件中一次獲取一行。 – Kevin