ในบทช่วยสอนนี้ เราจะพูดถึงโปรแกรมพิมพ์ 10 บรรทัดสุดท้ายจากสตริงที่กำหนด
เราจะได้รับสตริงที่ประกอบด้วยอักขระขึ้นบรรทัดใหม่ (newline) เพื่อระบุจุดเริ่มต้นของบรรทัดถัดไป งานคือเริ่มจากท้ายและพิมพ์ทั้ง 10 บรรทัดนับจากท้าย
ตัวอย่างโค้ด
#include <bits/stdc++.h>
using namespace std;
#define DELIM '\n'
// พิมพ์ 10 บรรทัดสุดท้าย
void print_last_lines(char* str, int n) {
if (n <= 0)
return;
size_t cnt = 0; // เก็บจำนวนบรรทัด
char* target_pos = NULL;
// หาตำแหน่งเริ่มต้นของบรรทัดสุดท้าย
target_pos = strrchr(str, DELIM);
if (target_pos == NULL) {
cout << "Given string is a single line string";
return;
}
// ย้ายไปตำแหน่งเริ่มต้นของบรรทัดที่ 1 (นับจากท้าย)
while (cnt < n) {
// ย้ายไปบรรทัดถัดไป
while (str < target_pos && *target_pos != DELIM)
--target_pos;
if (*target_pos == DELIM)
--target_pos, ++cnt;
// ถ้าสตริงมีน้อยกว่า 10 บรรทัด ให้ break
else
break;
}
if (str < target_pos)
target_pos += 2;
cout << target_pos << endl;
}
int main(void) {
char* str1 = "str1\nstr2\nstr3\nstr4\nstr5\nstr6\nstr7\nstr8\nstr9"
"\nstr10\nstr11\nstr12\nstr13\nstr14\nstr15\nstr16\nstr17"
"\nstr18\nstr19\nstr20\nstr21\nstr22\nstr23\nstr24\nstr25";
print_last_lines(str1, 10);
return 0;
}
ผลลัพธ์
str16 str17 str18 str19 str20 str21 str22 str23 str24 str25