这会在换行符处打断一个字符串,并为报告的字符串修剪空格。它不会像strtok那样修改字符串,这意味着这可以在未知来源的const char*
上使用,而strtok不能。所不同的是begin
/end
是指向原始字符串字符的指针,所以不会像strtok给出的以null结尾的字符串。当然这使用静态本地,所以不是线程安全的。
#include <stdio.h> // for printf
#include <stdbool.h> // for bool
#include <ctype.h> // for isspace
static bool readLine (const char* data, const char** beginPtr, const char** endPtr) {
static const char* nextStart;
if (data) {
nextStart = data;
return true;
}
if (*nextStart == '\0') return false;
*beginPtr = nextStart;
// Find next delimiter.
do {
nextStart++;
} while (*nextStart != '\0' && *nextStart != '\n');
// Trim whitespace.
*endPtr = nextStart - 1;
while (isspace(**beginPtr) && *beginPtr < *endPtr)
(*beginPtr)++;
while (isspace(**endPtr) && *endPtr >= *beginPtr)
(*endPtr)--;
(*endPtr)++;
return true;
}
int main (void) {
const char* data = " meow ! \n \r\t \n\n meow ? ";
const char* begin;
const char* end;
readLine(data, 0, 0);
while (readLine(0, &begin, &end)) {
printf("'%.*s'\n", end - begin, begin);
}
return 0;
}
输出:
'meow !'
''
''
'meow ?'
为什么不用'strtok'? – Tudor
这是功课吗? –
我正在探索C,我碰到了这个 – larzgmoc