文字のストリームを文字ごとにスキャンするための単純なラッパークラスを作成しています。
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
)それらは1つの改行でもあります!
行番号と列番号を処理する関数は次のとおりです。
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;
}
}
ありがとう!