Hỏi về hàm gets() và fgets()

Em chào mọi người, em mới học lập trình C được vài tuần và có một chút thắc mắc về hàm gets và fgets như sau.
Theo em đọc và tìm hiểu thì hàm gets() để nhập vào giá trị của string, nhưng có một số trình biên dịch bây giờ không dùng và có một hạn chế là không đếm số kí tự max. Hạn chế đó được giải quyết bằng hàm fgets() - giúp đưa vào xâu kí tự và có giới hạn kí tự của xâu.
Mọi người cho em hỏi em hiểu như trên có đúng chưa ạ ? và ngoài điểm khác nhau trên, hàm gets() và fgets() còn khác gì nhau nữa không ạ ?
Tại sao em lập trình để đếm số lần xuất hiện của xâu str2 trong xâu str1 thì khi sử dụng hàm fgets() lại bị sai output ạ ? Cụ thể như sau:

dùng gets:

#include <stdio.h>
#include <string.h>
int main(){
	int count =0; 
	char str1[100], str2[100], *p;
	gets(str1);
	gets(str2);
	p=strstr(str1,str2);
	while (p!=NULL) {
		count++;
		p=strstr(p+1,str2); 
	}
	printf("%d",count);
	return 0; 
}

dùng fgets():

#include <stdio.h>
#include <string.h>
int main(){
	int count =0; 
	char str1[100], str2[100], *p;
	fgets(str1,100,stdin);
	fgets(str2,100,stdin);
	p=strstr(str1,str2);
	while (p!=NULL) {
		count++;
		p=strstr(p+1,str2); 
	}
	printf("%d",count);
	return 0; 
}

Khi em để input str1: abcabcabc, str2: bc thì output của cách 1 ra 3 ( đúng ) còn output của cách 2 lại ra 1 ( sai ) ạ ?
Em cảm ơn nhiều ạ.

Bạn hiểu thế là ổn rồi.

Từ tài liệu:
https://www.cplusplus.com/reference/cstdio/gets/
https://www.cplusplus.com/reference/cstdio/fgets/

Notice that gets is quite different from fgets: not only gets uses stdin as source, but it does not include the ending newline character in the resulting string and does not allow to specify a maximum size for str (which can lead to buffer overflows).

Chú ý đoạn tô đậm nhé.
Đó là lý do dẫn đến kết quả khác nhau.

4 Likes

À mình hiểu rồi ạ, mình cảm ơn ^^

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