Skip to content

Commit

Permalink
Minh họa cgetline có theo dõi kích thước vùng nhớ đã cấp phát
Browse files Browse the repository at this point in the history
  • Loading branch information
bangoc committed Dec 29, 2021
1 parent 9ed9efb commit 38a9889
Show file tree
Hide file tree
Showing 3 changed files with 38 additions and 4 deletions.
3 changes: 2 additions & 1 deletion examples/ext/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,2 +1,3 @@
add_executable(cgetline_demo cgetline_demo.c)
add_executable(cstrdup_demo cstrdup_demo.c)
add_executable(cstrdup_demo cstrdup_demo.c)
add_executable(cgetline_buffsize cgetline_buffsize.c)
27 changes: 27 additions & 0 deletions examples/ext/cgetline_buffsize.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
/*
(C) Nguyen Ba Ngoc
Minh họa sử dụng cgetline
*/

#include "ext/io.h"

#include <string.h>

int main() {
char *line = NULL;
long n = 0;
printf("Nhập vào 1 dòng (nhập STOP để kết thúc chương trình): ");
for (;;) {
// Có thể sử dụng NULL hoặc 0 thay cho &n nếu không quan tâm đến
// kích thước vùng nhớ được cập phát
cgetline(&line, &n, stdin);
if (strcmp(line, "STOP\n") == 0) {
break;
}
printf("Dòng đã nhập: %s", line);
printf("Độ dài chuỗi ký tự: %zu\n", strlen(line));
printf("Kích thước vùng nhớ: %ld\n", n);
}
free(line);
return 0;
}
12 changes: 9 additions & 3 deletions ext/io.h
Original file line number Diff line number Diff line change
Expand Up @@ -37,10 +37,10 @@
* Trong trường hợp không thể cấp phát được bộ nhớ để lưu
* dòng, hàm trả về NULL và *lineptr == NULL.
*/
static char *cgetline(char **lineptr, long n, FILE *inp) {
static char *cgetline(char **lineptr, long *nptr, FILE *inp) {
char buff[CGEN_IO_BUF_SIZE];
long idx = 0, len, tmp;

long n = nptr? *nptr: 0;
while (fgets(buff, CGEN_IO_BUF_SIZE, inp)) {
len = strlen(buff);
tmp = idx + len + 1;
Expand All @@ -60,7 +60,13 @@ static char *cgetline(char **lineptr, long n, FILE *inp) {
break;
}
}
return idx > 0? *lineptr: NULL;
if (idx == 0) {
return NULL;
}
if (nptr) {
*nptr = n;
}
return *lineptr;
}

#define clear_stdin() while (getchar() != '\n')
Expand Down

0 comments on commit 38a9889

Please sign in to comment.