re2cで改行のカウント
文字列に含まれる改行をカウントするプログラム。
文字列の最後は'\0'であること。
改行は、"\r", "\n", "\r\n"のいずれかを1とカウントする。
改行は、"\r", "\n", "\r\n"のいずれかを1とカウントする。
ソースコード
- lineCntr.re
#include <stdio.h>
#include <string>
int lineCntr(std::string buf) {
int cnt = 0;
char* p = const_cast<char*>(buf.c_str());
for (;;)
/*!re2c
re2c:define:YYCTYPE = "char";
re2c:define:YYCURSOR = p;
re2c:yyfill:enable = 0;
re2c:indent:top = 1;
re2c:indent:string = " ";
re2c:labelprefix = l_linecnt_;
ret = '\r' | '\r'? '\n' ;
any = . ;
[\000] { break; }
ret { ++cnt; continue; }
any { continue; }
*/
return cnt;
}
int main(int argc, char** argv)
{
std::string str = "abcd\r\nefgc\n\n\n\raaa\n \r\n \n";
int x = lineCntr(str) ;
printf( "cnt = %d, size=%d\n", x, str.length() );
return 0;
}
コンパイル
% [[re2c]] -i -o lineCntr.cpp lineCntr.re % g++ -o run.x lineCntr.cpp
結果
% ./run.x cnt = 8, size=24