Video Ngôn Ngữ C - 24 - Hàm nhập vào từ bàn phím, scanf

c
video

(Lê Trần Đạt) #1

#Đăng ký khóa học C++ cơ bản 2016 ( NEW ) tại đây :
#Thông tin về khóa học xem tại đây :

-Sự khác biệt giữa 2 khóa học cũ và mới :
+Khóa học C++ cơ bản 2016 là khóa học mới, được đầu tư nhiều hơn từ nội dung, phương pháp học, cách học hiệu quả.
+Trong khóa học còn có nhiều kiến thức mới như thực hành trên HackerRank, thực hành trên Codefights và Đạt nghĩ mọi người nên học khóa học mới, bởi vì đây là kiến thức mới, phù hợp với hiện tại… Mặt khác âm thanh cũng tốt hơn nhiều so với khóa học cũ giúp đỡ việc lắng nghe và hiểu được tốt hơn.


Cho em hỏi tại sao mình không thể nhập kí tự được? (lap trinh c)
Tổng hợp các video hướng dẫn lập trình C của Lê Trần Đạt
Tổng Hợp C,C++: Hỗ trợ giải tất cả các bài tập C & C++
(nhatlonggunz) #2

Cho em hỏi sao lúc in ra màn hình console, nó không ghi tên em, nó chỉ ghi tên xong bỏ luôn phần em mới điền vào
cụ thể: em điền 14 9 long gioi a
ra màn hình console cái printf cuối nó ghi:ban 14, lop 9, ten , hoc luc gioi, thich chu a

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int tuoi, lop;
    char ten[10];
    char hocluc[4];
    char kytu;
    printf("ban bao nhieu tuoi, lop may, ten gi, hoc luc gi, thich chu gi");
    scanf("%d %d", &tuoi, &lop);
    scanf("%s", ten);
    scanf("%s", hocluc);
    scanf("%c", &kytu);
    printf("ban %d tuoi, lop %d, ten %s, hoc luc %s, thich chu %c", tuoi, lop, ten, hocluc, kytu);
    return 0;
}

Cách dùng fgets thay vì dùng scanf để nhập vào chuỗi trong C
[C]Không lưu được kết quả với hàm gets()
(BaoLe) #3

Đầu tiên mình xin được sửa lại code của bạn như sau:


#include <stdio.h>
int main()
{
    int tuoi, lop;
    char ten[10];
    char hocluc[4];
    char kytu;
    printf("ban bao nhieu tuoi, lop may, ten gi, hoc luc gi, thich chu gi.\n");
    scanf("%d %d", &tuoi, &lop);
    fflush(stdin);
    scanf("%s", &ten);
    fflush(stdin);
    scanf("%s", &hocluc);
    fflush(stdin);
    scanf("%c", &kytu);
    printf("ban %d tuoi, lop %d, ten %s, hoc luc %s, thich chu %c", tuoi, lop, ten, hocluc, kytu);
    return 0;
}

Mình xin được giải thích đơn giản về lỗi muk pạn mắc phải .Hàm scanf lấy dữ liệu trên stdin và bản thân nó không có khả năng để xóa ký tự \n trên stdin nên khi sử dụng 2 lần liên tiếp thì sẽ xảy ra hiện tượng: lệnh scanf ở lần thứ 2 sẽ bị trôi,để khắc phục lỗi này ta đặt lệnh fflush(stdin) sau câu lệnh scanf lần thứ 1.Nghe có vẻ rất phức tạp nhưng mình chỉ cần bạn nhớ 1 điều đơn giản như sau:

scanf("%s", &ten);
fflush(stdin);
scanf("%s", &hocluc);

và khi sử dụng liên tiếp nhiều lệnh scanf thì cũng làm giống như vậy.1 điều nữa mình muốn nói với bạn,trong code mình không dùng hàm gì liên quan đến stdlib.h ,vì thế mình khỏi phải khai báo nó làm gì cho mệt cả.Mình xin được kết thúc ở đây, có gì không hiểu bạn cứ hỏi.


(nhatlonggunz) #4
  1. Xin cám ơn bạn rất nhiều
  2. Mình chỉ để theo mặc định code::blocks, ghi sẵn rồi thì mình không xóa đi làm gì cho mệt cả và nó không ảnh hưởng tới code của mình
  3. Bạn nói rõ hơn về fflush(stdin); được không, mình mới thấy lần đầu

(nhatlonggunz) #5

anh @ltd giúp em vấn đề ở post 2 với, em đổi kiểu gì thì cái tên nó vẫn để trống khi ra console, mấy cái khác chả bao giờ bị


(Lê Trần Đạt) #6

Tức là sao em, vẫn là cái code ở đây à

em nhập vào cái gì?


(nhatlonggunz) #7

14 9 long gioi a

lẽ ra nó phải ghi: ban 14 tuoi, lop 9, ten long, hoc luc gioi, thich chu a
nhưng nó lại ghi: bạn 14 tuoi, lop 9, ten , hoc luc gioi, thich chu a


(Lê Trần Đạt) #8
#include <stdio.h>
#include <stdlib.h>

int main()
{
    int tuoi, lop;
    char ten[10];
    char hocluc[5];
    char kytu;
    printf("ban bao nhieu tuoi, lop may, ten gi, hoc luc gi, thich chu gi ");
    scanf("%d %d", &tuoi, &lop);
    fgets(ten, sizeof(ten), stdin); // enter cho nay
    fflush(stdin);
    fgets(hocluc, sizeof(hocluc), stdin);  // enter cho nay
    fflush(stdin);
    scanf("%c", &kytu);
    printf("ban %d tuoi, lop %d, ten %s, hoc luc %s, thich chu %c", tuoi, lop, ten, hocluc, kytu);
    return 0;
}

Em phải dùng hàm fgets để nhập vào string. Mà tiếc là anh chưa hướng dẫn fgets. Em cứ dùng như anh ví dụ đấy. Nhưng để nhập vào string, thì em phải kết thúc bằng ENTER.

Thế nên thay vì nhập

14 9 long gioi a

Em phải nhập

14 9 long
gioi
a

Có nghĩa là em enter ngay sau chữ long và sau chữ gioi

ở dây anh đã tăng kích thước của hocluc lên 5 để chưa được chữ gioi. Ta cần chỗ cho ký tự kết thúc chuỗi nữa.


Cách dùng fgets thay vì dùng scanf để nhập vào chuỗi trong C
(nhatlonggunz) #9

thanks anh ạ, anh thức khuya thế


(Lê Trần Đạt) #10

anh có việc, đáng ngủ mà thấy em hỏi cũng lâu, không trả lời thì tội, thế nên ráng trả lời xong giờ ngủ. Eo, mai dậy không nổi rồi :frowning:


(Dao Trong Bach) #11

Trong clip anh nhập string dat có cần dùng fgets đâu nhỉ? Anh giải thích cho em hiểu với.


(Lê Trần Đạt) #12

Hàm fgets sẽ an toàn hơn khi nhập chuỗi, bởi vì hàm này thông báo cho C biết là mình sẽ chỉ nhập vào bao nhiêu ký tự. Nhờ đó sẽ tránh được việc nhiều nhiều ký tự hơn khả năng chứa của chuỗi.

Ví dụ, ta tạo một chuỗi có sức chứa 10 ký tự (và một ký tự kết thúc chuỗi). Nhưng nếu dùng gets và mình nhập vào 11 ký tự. Thì ký tự thứ 11 sẽ làm tràn chuỗi. Điều này gây ra lỗi.

Riêng về lệnh scanf, lệnh này không dùng cho việc nhập chuỗi, nó phù hợp cho việc nhập số và char.


(Dao Trong Bach) #13

Em dùng scanf cho chuỗi và ko dùng fflush. Khi nhập các đoạn thì e sử dụng dấu cách.
Cụ thể là : 14 9 long gioi a
Em thấy ra kết quả bình thường.

Trong trường hợp e ko biết fgets thì code như vậy có vấn đề gì ko anh?

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int tuoi, lop;
    char ten[6];
    char hocluc[6];
    char kytu;
    printf("ban bao nhieu tuoi, lop may, ten gi, hoc luc gi, thich chu gi \n");
    scanf("%d %d ", &tuoi, &lop);
    scanf("%s %s ", ten, hocluc);
    scanf("%c", &kytu);
    printf("ban %d tuoi, lop %d, ten %s, hoc luc %s, thich chu %c", tuoi, lop, ten, hocluc, kytu);
    return 0;
}

(Lê Trần Đạt) #14

Em không nên nhập chuỗi sử dụng scanf. Nếu em muốn nhập vào một chuỗi có khoảng trắng thì scanf sẽ không nhập được. Bởi vì scanf sẽ dừng nhập khi thấy khoảng trắng.


(nguyenleanhquan) #15

anh Đạt cho em hỏi là đoạn mã này của em bị lỗi ở đâu ạ:

#include <stdio.h>
#include <stdlib.h>

int main()
{
    char a,b;
    printf("nhap vao hai ki tu: ");
    scanf("%c%c",&a,&b);
    printf("ki tu da nhap la: %c va %c",a,b);
    return 0;

em cho chạy chương trình rồi bấm “a” thì chỉ in ra la: nhap vao hai ki tu: a; ki tu da nhap vao la: a va:
em ko nhập vào được kí tự thứ hai ạ.


(Lê Trần Đạt) #16

Như code em gửi thì bị thiếu dấu } ở cuối hàm main


(nguyenleanhquan) #17
#include <stdio.h>
#include <stdlib.h>

int main()
{
    char a,b;
    printf("nhap vao ki tu hai ki tu: ");
    scanf("%c%c",&a,&b);
    printf("ki tu da nhap la: %c va %c",a,b);
    return 0;
}

(nguyenleanhquan) #18

anh xem lại hộ em vs ạ.


(Thanh Nguyen Trung) #19

Cho mình hỏi 2 đoạn code này của mình có gì khác nhau, tại sao lại cho ra 2 kết quả khác nhau:
TH1:

int main(int argc, const char * argv[])
{
    double a,b;
    a=-9;
    b=fabs(a);
    printf("%.2f",b);
}

=> Trả về kết quả 9.00

TH2:

int main(int argc, const char * argv[])
{
    double a,b;
    printf("a:");
    scanf("%f",&a);
    b=fabs(a);
    printf("%.2f",b);
}

Nhập từ bàn phím a=-9, trả về kết quả là 0.00

TH2 sai ở đâu???


( Ngô Doãn Tuấn) #20

bạn ơi double định dạng là %lf nha :smiley:


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