Tôi đã gặp vấn đề này khi tôi muốn kiểm tra những gì tôi nhập là số. Hàm scanf sẽ trả về 1 nếu tôi nhập thành công một số. Vì vậy, đây là những gì tôi đã viết:điều gì sẽ xảy ra khi bạn nhập những thứ như 12ab vào scanf ("% d", & argu)?
int argu;
while(scanf("%d",&argu)!=1){
printf("Please input a number!\n");
}
Nhưng khi tôi nhập những thứ như abcd vào nó, vòng lặp sẽ đi mãi mãi và không dừng lại cho lời nhắc.
Tôi đã tìm kiếm trực tuyến và thấy rằng nó có liên quan đến bộ nhớ cache và tôi cần dọn dẹp bộ nhớ cache để scanf có thể nhận dữ liệu mới. Vì vậy, tôi đã thử fflush nhưng nó không hoạt động.
Sau đó, tôi thấy điều này:
int argu,j;
while(scanf("%d",&argu)!=1){
printf("Please input a number!\n");
while((j=getchar())!='\n' && j != '\n');
}
Sau đó, khi những điều tôi đầu vào như 'abcd' nó làm việc tốt và nó nhắc nhở cho đầu vào của tôi. Nhưng khi tôi nhập những thứ như '12ab', nó sẽ không hoạt động trở lại.
Vì vậy, có cách nào tôi có thể kiểm tra đầu vào cho scanf ("% d", & argu) thực sự là một số và nhắc cho đầu vào khác nếu không?
EDIT:
Tôi thấy câu trả lời và giải quyết vấn đề của tôi bằng cách sử dụng while(*eptr != '\n')
.
Lưu ý rằng chức năng fgets
thực sự đọc '\ n' đối với mảng và fget
thì không. Vì vậy hãy cẩn thận.
sử dụng mã như fgets (s, 10, stdin)? – Gnijuohz
Cảm ơn! Tôi không biết strtol. Đã học hỏi được rất nhiều! – Gnijuohz
xin lỗi, bạn có thể giải thích 'if (eptr == NULL ||! Isspace (* eptr))'? khi sử dụng mã mà bạn cung cấp, các đầu vào như '12 34 'được chấp nhận nhưng chúng không được. khi tôi nhập '1234' thì eptr sẽ trỏ đến đâu và làm thế nào về '12ab' và '12 34 '? – Gnijuohz