Scanf gets và fgets

chào mọi người tình hình là em có bài code sửa 1 dòng trong file txt có nội dung là

Bui Anh Tuan
Son Tung MTP
Kha Banh 
Huan Hoa Hong
#include <stdio.h>
#include <stdlib.h>

int main() {
	
	FILE * fptr;
	FILE * ftemp;
	char path[100];
	char newLine[1000]; // luu dong can sua
	char buffer[1000];
	int line,count; // luu string de chua chuoi tam thoi
	printf("Nhap file ban mua chinh sua: ");
	scanf("%s",&path );
	
	printf("Nhap dong ban mua sua: ");
	scanf("%d",&line);

	fflush(stdin);

	printf("Nhap noi dung ban muon sua: ");
	gets(newLine); // loi xay ra
	
	fptr = fopen(path,"r");
	ftemp = fopen("temp.txt" , "w");
	
	if (fptr == NULL || ftemp == NULL)
    {
        printf("\nUnable to open file.\n");
        printf("Please check whether file exists and you have read/write privilege.\n");
        exit(EXIT_SUCCESS);
    }
    
    count = 0;
    while ( fgets(buffer,1000 , fptr) != NULL) {
    	count++;
    	if ( count == line) {
    		fputs(newLine,ftemp);
		} else {
			fputs(buffer,ftemp);
		}
	}
	
	fclose(fptr);
	fclose(ftemp);
	
	remove(path);
	rename("temp.txt",path);
	printf("Succes\n");
	return 0;
	
	
}

khi em để gets(newLine)scanf("%d[^\n]") thì nó sẽ bị ntn ạ

còn khi em đẻ thành fgets(newLine, 1000, stdin); thì lại okke.1
Nó sẽ thay đổi đúng nội dùng dòng thứ 2 thành ntn mà không bị liền dòng như trên kia ạ:

Bui Anh Tuan
abcdef
Kha Banh 
Huan Hoa Hong

Đúng là cả 3 cách dùng của bạn đều gần như giống nhau.
Nhưng sẽ có khác biệt nhất định khi bạn dùng:

  1. scanf("%[^\n]", str) sẽ nhập 1 dòng nhưng không có kí tự xuống dòng được ghi vào cuối chuỗi.
  2. gets(str) đã bị cho là không an toàn, một số trình biên dịch sẽ cảnh báo; thậm chí trình biên dịch MSC++ sẽ báo lỗi luôn.
  3. fgets(str) đã an toàn hơn và được khuyến khích dùng.
  4. Cả 2 hàm getsfgets đều ghi kí tự xuống dòng vào cuối chuỗi.
4 Likes

cái [^\n] nó có nghĩa là ngừng đọc khi gặp \n nha.

3 Likes

thế có cách nào để có thể dùng scanf đọc luôn cả kí tự \n xuống dòng k ạ em định dùng scanf("%[^\n]%c", str) thêm %c để đọc thêm kí tự \n nhưng có vẻ vẫn k chạy đc ạ

Bạn có thể đọc xong rồi tự thêm kí tự \n vào cuối chuỗi được mà :stuck_out_tongue:

2 Likes

dạ vâng em cảm ơn ạ . em dùng thêm strcat(newLine, “\n”); và đã đc rồi ạ

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