Video Ngôn Ngữ C - 25 - Dùng hàm getchar để nhập vào chuỗi có khoảng trắng

c
video

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

Source Code

#include <stdio.h>

int main()
{
    char c;
    char ten[20];
    printf("Nhap ten, nhan ENTER de ket thuc\n");
    int i = 0;
    do {
        //c = getchar();
        scanf("%c", &c);
        ten[i] = c;
        i++;
    } while (c != '!');
    ten[i] = 0;
    printf("xin chao %s\n", ten);
    return 0;
}

#Đă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.


Tổng hợp các video hướng dẫn lập trình C của Lê Trần Đạt
Code đưa vào switch case chạy không ổn định?
(Thực tế khắc nghiệt) #2

a Đạt ơi! giúp e vơi! chỗ điều kiện của if báo lỗi (so sánh giữa con trỏ và giá trị integer) a xem cách e giải đúng hay sai với ạ!

int main()
{
    char ten[20];
    char gan;
    int i=0;
    printf("nhap ten cua ban va ket thuc bang enter!");
    while (i=<20);
    {
        if(ten!='\n') {
            break;
            printf("ten ban co phai la: $s",ten);

        } else
            gan=getchar();
            ten=gan;
            i++;
    }
    return 0;
}

(Đỗ Trung Quân) #3

Mình vừa sửa lại format code giúp bạn. Bạn tham khảo bài viết dưới đây, để sử dụng Markdown trong diễn đàn


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

Chỗ này bị dư dấu ; nè Mật Trăng ơi

Nhớ thêm

#include <stdio.h>

Không thể gán như thế này được, ten là mảng kiểu char còn gan là char.

Anh sửa lại như sau

#include <stdio.h>

int main()
{
    char ten[20];
    char gan;
    int i=0;
    printf("nhap ten cua ban va ket thuc bang enter!");
    while (i < 20) // de danh` 1 ky tu ket thuc chuoi '\0'
    {
        gan=getchar();
        if(gan != '\n')
            ten[i] = gan;
        else
            break;
        i++;
    }
    ten[i] = 0; // ket thuc chuoi
    printf("Chao %s", ten);
    return 0;
}

(Thực tế khắc nghiệt) #5

tks a đạt nhìu nghen! thế là tối nay a đạt thấy mặt trăng trong khi vẫn ngồi máy tính giúp tụi e! :smiley:
vậy mấy clip e làm bài tập đúng sai post lên đây lun a nha! e gà mờ lắm


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

Cứ video nào xem xong mà em thắc mắc, em hỏi ngay dưới video đó cho anh giải thích cho dễ. Khỏi nhầm lẫn sang video khác :smile:


(Thực tế khắc nghiệt) #7

thì ý e là thế đó! cho sau này có bạn nào thắc mắc vô cái xem đc! mà nếu thắc mắc bik đâu e trả lời đc trong lúc a Đại bận :wink:


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

Chuẩn rồi Mộng Mít càng học càng giỏi. Nhưng mà hướng dẫn người khác thì càng mau giỏi hơn ^^!


(Thuyvfu) #9
while(c!='\n');

Trong clip mình k hiểu biểu thức này nghĩa là gì.
Mọi người có thể giải thik giúp mình không.


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

while(c!='\n'); Không làm gì cả, vì mình đặt dấu ; ngay phía sau nó. Đây là một câu lệnh vô nghĩa.


(Thuyvfu) #11

Cảm ơn anh nhìu :smiley:
Thế mà em k suy ra.


(Người Cô Đơn) #12

Anh Đạt ơi,em vẫn chưa rõ hàm scanf("%c",&c) lắm. Tại sao nó lại đặt trong vòng lặp mà không đặt dưới printf???Em tưởng phải đặt ngay ở dưới nó mới biết là nó đang scanf cái hàm nào chứ ạ.


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

scanf không liên quan đến printf. Việc đặt sau printf chỉ giúp cho người nhập hiểu được phải làm gì. Ví dụ để nhập vào số n, thì ta nên thông báo cho người dùng

printf("nhap vao n: "); 

(BaoLe) #14

Vì trong code bạn đã khai báo

char ten[20];

Khi đó: ten là địa chỉ của phần tử đầu tiên của mảng kí tự ten[20]. Cụ thể:

ten=&ten[0];

Nếu nói rõ hơn ten là một con trỏ kiểu char,trỏ đến phần tử đầu tiên của mảng ten[20](phần tử ten[0]).Vì thế,câu lệnh:

if(ten!='\n')

là sai.
Còn phần sửa lại thì anh Đạt đã giành làm mất rồi nên mình xin kết thúc ở đây.


(nhatlonggunz) #15

Anh dat oi, tai sao trong vong do while, cho c = getchar thi khi lap lai nhieu lan no khong bat minh nhap lai, ma chi nhap 1 lan thoi.


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

Em cho anh xem code cụ thể của hàm do while em viết đi.


(nhatlonggunz) #17

Giống y chang cái của anh ấy.
Cái em thắc mắc là mỗi lần lặp lại vòng loop, tại sao cái getchar không bắt mình nhập thêm lần nữa mà chỉ nhập lần đầu, lần sau tự gan vào mang luôn


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

Vậy em hiểu sai vấn đề rồi. Ở đây không phải là không bắt mình nhập thêm nhiều lần, mà vấn đề là ở đây là một khi mình nhập một chuỗi dài. Sau đó mình nhấn ENTER để truyền chuỗi đó vào bên trong buffer. Khi đó hàm getchar sẽ dần dần đọc từng ký tự trong buffer.

Cụ thể, khi anh nhập daynhauhoc.com thì chuỗi này chưa được chương trình C đọc, mà đang được lưu ở trong buffer. Lúc này hàm getchar chưa đọc cái gì cả nó vẫn chờ. Sau đó khi anh bấm ENTER. Thì chuỗi này sẽ được đưa vào trong chương trình C, và kh này getchar mới bắt đầu đọc từng ký tự một.

Điều này làm cho em nghĩ rằng getchar không bắt mình nhập thêm, bản chất là nó đã có đầy đủ ký tự trong lần Enter trước đó.

Em nên xem thêm bài buffer của anh ở đây:


(nhatlonggunz) #19

Cho em hỏi bên C++ làm bài này như thế nào ạ


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

Em có thể làm tương tự, sử dụng hàm getchar, C++ cũng có hàm getchar như C. Đừng dùng cin, vì cin cũng tương tự như scanf


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