Nếu các bạn dùng hàm scanf để nhập chuỗi thì bạn sẽ thấy rằng không thể nhập được chuỗi có dấu cách hoặc nếu trước đó bạn nhập số thì sau đó không nhập được chuỗi nữa. Bạn hãy thử nghiệm với chương trình sau:
#include <stdio.h>
int main(){
int age= 0;
char fname[30], lname[30];
printf("Please enter your first name ");
scanf("%s", &fname);
printf("How old are you?");
scanf("%d", &age);
printf("Please enter your last name");
scanf("%s",&lname);
printf("\n-------------------------\n");
printf("%s \n%d \n%s",fname,age,lname);
system("pause");
return0;
}
Kết quả chạy chương trình:
Please enter your first name Nguyen Duy Anh
How old are you? Please enter your last name
------------------------------------------------
Nguyen
0
Duy
Giải thích:
scanf chỉ đọc được dữ liệu không có khoảng trắng, dấu cách, dấu tab, enter, … và các khoảng cách này sẽ được lưu vào bộ đệm bàn phím.Do đó bạn chỉ nhận được từđầu tiên trước dấu cách (chữ Nguyen).Sau mỗi dấu cách, các giá trị tiếp theo nếu phù hợp với kiểu dữ liệu của các biến tiếp theo thì nó sẽ gán luôn cho chúng và bạn sẽ không được nhập nữa. Do age kiểu nguyên nên không nhận được, lname sẽ nhận giá trị tiếp theo trong các giá trị nhận được là chữ Duy.
Hiện tượng như trên được gọi là hiện tượng trôi lệnh.
Để nhập được chuỗi có khoảng trắng (dấu cách) chúng ta sử dụng hàm gets.
Để không bị trôi lệnh khi nhập số trước và chuỗi sau ta cần xóa bộ đệm bàn phím bằng lệnh fflush(stdin)
Chương trình trên được sửa thành:
#include <stdio.h>
int main(){
int age= 0;
char fname[30], lname[30];
printf("Please enter your first name ");
gets(fname);
printf("How old are you?");
scanf("%d", &age);
fflush(stdin);
printf("Please enter your last name");
gets(lname);
printf("\n-------------------------\n");
printf("%s \n%d \n%s",fname,age,lname);
system("pause");
return0;
}
» Tin mới nhất:
» Các tin khác: