01/10/2018, 11:20

Xin ý tưởng fix lỗi khi nhập xâu với fgets() và so sánh xâu sử dụng strcmp()

Em viết file trong C dừng khi người dùng nhập vào 2 chữ “jk”. Tối đa 1 lần nhập là 4096 kí tự! Nhưng khi kiểm tra dùng hàm strcmp() thì không bao giờ được. Nhập vào em dùng hàm fgets(). Mong mọi người giúp đỡ!

HK boy viết 13:25 ngày 01/10/2018

Bạn có code không bạn? Mà sao bạn không dùng gets()?

nghia viết 13:21 ngày 01/10/2018

dùng hàm fgets(): để tránh vỡ vùng nhớ! em chỉ cho 4096 kí tự 1 lần nhập. code:

char* content = (char*) malloc(4096);
fgets(content, 4096, stdin);
while(1){
   if(strcmp(content, "jk") == 0){
           ///đóng file
           break;
   }
   esle{
           fputs(content, file);
           fflush(stdin);
           fgets(content, 4096, stdin);
   }
}
viết 13:31 ngày 01/10/2018

em đọc kỹ lại doc của fgets đi, sẽ thấy vấn đề:

Reads at most count - 1 characters from the given file stream and stores them in the character array pointed to by str. Parsing stops if end-of-file occurs or a newline character is found, in which case str will contain that newline character. If no errors occur, writes a null character at the position immediately after the last character written to str.

The behavior is undefined if count is less than 1.

chuỗi content đọc vào có chứa dấu \n nên so sánh với "jk" ko bao giờ bằng cả, phải so sánh với "jk\n"

chỉ khi quá 4095 ký tự thì mới ko có \n

đừng xài fflush(stdin) nữa, theo chuẩn thì nó ko có tác dụng gì. VS2015 2017 đã theo chuẩn câu lệnh này ko có tác dụng

tạo biến char content[4096]; luôn, cấp phát động làm gì?

nghia viết 13:24 ngày 01/10/2018

Cảm ơn anh! Em viết code bên linux! Em cũng có chú ý là khi nhập vào 2 chữ jk thì em cho strlen(content) = 3 Em cho nó show ra màn hình printf("%d", content[3]);–> giá trị là 0. Em gán cho thằng cần so sánh vị trí thứ 3 là 0x00 nó vẫn die nên em phải lên đây hỏi! Chắc em phải đọc kĩ từng dòng của giải thích! Em cảm ơn anh nhiều!

nghia viết 13:21 ngày 01/10/2018

Anh có thể cho em link doc anh đọc đc không? em tìm trên mạng thì nó chỉ nói khái quát không chi tiết! đặc biệt dòng “in which case str will contain that newline character”

viết 13:21 ngày 01/10/2018

http://en.cppreference.com/w/c/io/fgets

muốn coi ký tự thứ 3 là gì thì in content[2] chứ, content[0] là ký tự đầu tiên rồi.

mấy cái doc ít ai để ý lắm, tới khi gặp lỗi với nó mới biết mình làm gì sai

nghia viết 13:24 ngày 01/10/2018

ha ha em viết nhầm! cảm ơn anh nhiều!

Bài liên quan
0