Cho một chuỗi chứa ký tự xuống dòng '\n' phân tách các dòng và một số nguyên N. Nhiệm vụ: in ra N dòng cuối cùng của chuỗi (tính từ cuối lên).
Giải thuật: Dùng strrchr tìm ký tự '\n' cuối cùng, sau đó lùi lại N lần để tìm vị trí bắt đầu của dòng thứ N từ cuối.
Ví dụ minh họa (C++)
#include <bits/stdc++.h>
using namespace std;
#define DELIM '\n'
void print_last_lines(char* str, int n) {
if (n <= 0) return;
size_t cnt = 0;
char* target_pos = nullptr;
target_pos = strrchr(str, DELIM); // tìm '\n' cuối cùng
if (!target_pos) {
cout << "Chuoi chi co mot dong\n";
return;
}
// Lùi lại n dòng
while (cnt < n) {
while (str < target_pos && *target_pos != DELIM) --target_pos;
if (*target_pos == DELIM) { --target_pos; ++cnt; }
else break; // không đủ dòng
}
if (str < target_pos) target_pos += 2; // bỏ qua '\n'
cout << target_pos << endl;
}
int main() {
char* str1 = "str1\nstr2\nstr3\nstr4\nstr5\nstr6\nstr7\nstr8\nstr9\n"
"str10\nstr11\nstr12\nstr13\nstr14\nstr15\nstr16\nstr17\n"
"str18\nstr19\nstr20\nstr21\nstr22\nstr23\nstr24\nstr25";
print_last_lines(str1, 14);
return 0;
}
Kết quả
str12 str13 str14 str15 str16 str17 str18 str19 str20 str21 str22 str23 str24 str25