我正在编写一个简单的包装类,用于逐个字符地扫描字符流。
Scanner scanner("Hi\r\nYou!");
const char* current = scanner.cchar();
while (*current != 0) {
printf("Char: %d, Column: %d, Line: %d\n", *current, scanner.column(), scanner.line());
current = scanner.read();
}
C:\Users\niklas\Desktop>g++ main.cpp -o main.exe
C:\Users\niklas\Desktop>main.exe
Char: 72, Column: 0, Line: 0
Char: 105, Column: 1, Line: 0
Char: 13, Column: 0, Line: 1
Char: 10, Column: 0, Line: 2
Char: 89, Column: 1, Line: 2
Char: 111, Column: 2, Line: 2
Char: 117, Column: 3, Line: 2
Char: 33, Column: 4, Line: 2
这个例子已经显示了我遇到的问题。可以解释\r
为换行符,也可以理解为\n
. 但是在一起(\r\ n
)它们也只是一个新行!
处理行号和列号的函数是这样的:
void _processChar(int revue) {
char chr = _source[_position];
if (chr == '\r' or chr == '\n') {
_line += revue;
_column = 0;
}
else {
_column += revue;
}
}
当然,我可以只查看出现在当前位置的字符之后的字符,但是:我不检查源上的 NULL 终止,因为我希望能够处理可能包含\0
字符而不被终止的字符流那一点。
我怎样才能以这种方式处理 CRLF?
编辑1:DOH!这似乎工作正常。这在任何情况下都是安全的还是我在某个地方有问题?
void _processChar(int revue) {
char chr = _source[_position];
bool is_newline = (chr == '\r' or chr == '\n');
if (chr == '\n' and _position > 0) {
is_newline = (_source[_position - 1] != '\r');
}
if (is_newline) {
_line += revue;
_column = 0;
}
else {
_column += revue;
}
}
谢谢!