Cấu trúc hàm strlen trong cấu trúc tệp

Ai cho e biết với.
s[strlen(s)-1]='\0'; trong hàm dưới.
Dòng này có nghĩa là gì vậy ạ. Nếu không có nó chương trình vẫn chạy dc ạ.

struct TS{
char sbd[10],ht[30];
float dt;
};
void nhaptstutep(char tentep[],int *n,TS *&ts)
{
FILE *tu;
tu=fopen(tentep,"rt");
if(ferror(tu)) puts("loi mo tep");
else
{ int i;char s[30];
fscanf(tu,"%d\n",n);
ts=(TS*) malloc(sizeof(TS)*(*n));
for(i=0;i<*n;i++)
{
fgets(s,10,tu);
s[strlen(s)-1]='\0';
strcpy(ts[i].sbd,s);
fgets(s,30,tu);
s[strlen(s)-1]='\0';
strcpy(ts[i].ht,s);
fscanf(tu,"%f\n",&ts[i].dt);
}
}

Dòng đó là thừa vì fgets đã tự kết chuỗi cho ta rồi.

3 Likes

Là sao ạ. Nhưnh dòng đó có nghĩalà sao ạ. Có nghĩa là dùng cuối chuỗi sẽ kết thúc bằng kí tự \0 đó ạ. Nếu k có thì nó in ra ký tự khác đúng ko ạ.

@rogp10 đã bảo là hàm fgets() nó tự thêm kí tự \0 vào cuối chuỗi rồi, bạn không cần dòng s[strlen(s)-1]='\0'; vì nó thừa.

http://www.cplusplus.com/reference/cstdio/fgets/

A terminating null character is automatically appended after the characters copied to str .

1 Like

Hm, vì fgets sẽ lấy luôn cả dấu enter vào kết quả, nên cậu cần dòng đó để xóa dấu enter cuối cùng đi. Cậu thử in ra xem :smiley:

1 Like

tự facepalm

A newline character makes fgets stop reading, but it is considered a valid character by the function and included in the string copied to str

Thực ra khi đọc quá số kí tự thì kí tự cuối cùng sẽ không phải là ‘\n’ :smiley:

3 Likes

Cái dòng này nói thật là cái dòng vô dụng nhất mình từng thấy. strlen là phải dựa vào ký tự \0 cuối chuỗi để tính. Nên chốt lại là bạn dùng strlen để tính vị trí chỗ có \0, xong lại gán chỗ đó thành \0?!

PS: đã xóa comment “lỗi” :frowning:

1 Like

Hì, strlen(s)-1 mà cậu ơi? :smiley: Nó để tính index trước \0 chứ? :smiley:

2 Likes

Ừ nhỉ, thanks @library, mình bị lỗi off-by-one rồi :sweat_smile:

2 Likes

Ui cảm ơn ạ. Nếu dòng đó có thì nó sẽ in ra thẳng hàng đẹp. Còn k thì nó in k đẹp lắm mik coa thử in rồi… Nhưng mà mình tưởng hàm strlen là dùng để đếm độ dài chuỗi ạ.

Kkk. Dù sao cg cảm ơn đã dùng chút tg để dọc bài mình hì.

Dạ cảm ơn. Bạn ạ. Hì

strlen() còn chỉ ra kí tự cuối cùng để sửa :slight_smile:

2 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?