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

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;
}
3 Likes

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

2 Likes

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:

1 Like

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:

1 Like

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 ^^!

1 Like
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.

1 Like

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.

2 Likes

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

1 Like

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ứ ạ.

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: "); 
1 Like

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.

2 Likes

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.

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

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

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:

1 Like

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

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

1 Like

anh xem thử bài tập 2 của em với, em in ra thấy nó hoạt động tốt

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

int main()
{
    char c;
    char ten[20];
    printf("Nhap ten, enter de ket thuc\n");
    //int i = 0;
    while (c != '\n') {
        c = scanf("%s",ten);
        break;
        //ten[i]=c;
        //i++;
    }
    //ten[i]=0;

    printf("xin chao %s\n",ten);

    return 0;
}

Bài này anh chỉ ví dụ cách sử dụng scanf với %s thôi, không quan trọng lắm. Sau này đừng dùng scanf với %s. Bài sau anh sẽ giải thích.

Thế nên chạy được là được rồi.

This topic was automatically closed 100 days after the last reply. New replies are no longer allowed.

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