2012-12-11 46 views
6

Tôi đang dựa vào lập trình C. Tôi đã viết một vòng lặp lẻ nhưng không hoạt động trong khi tôi sử dụng %c trong scanf().
Đây là mã:Vòng lặp không hoạt động bằng% c

#include<stdio.h> 
void main() 
{ 
    char another='y'; 
    int num; 
    while (another =='y') 
    { 
     printf("Enter a number:\t"); 
     scanf("%d", &num); 
     printf("Sqare of %d is : %d", num, num * num); 
     printf("\nWant to enter another number? y/n"); 
     scanf("%c", &another); 
    } 
} 

Nhưng nếu tôi sử dụng %s trong mã này, ví dụ scanf("%s", &another);, sau đó nó hoạt động tốt.
Tại sao điều này xảy ra? Bất kỳ ý tưởng?

+0

Khi bạn nhập 'num' và nhấn ENTER, vì vậy mã ascii của ENTER được lưu trong bộ đệm scanf và bất cứ khi nào bạn đọc ký tự đơn tiếp theo, nó sẽ không chờ đầu vào của người dùng và mã ASCII 'ENTER' sẽ được lưu trữ trong biến 'else' khác. –

Trả lời

1

sử dụng getch() thay vì scanf() trong trường hợp này. Bởi vì scanf() hy vọng '\ n' nhưng bạn chỉ chấp nhận một char tại scanf(). do đó '\ n' được đưa ra cho lần quét tiếp theo() gây nhầm lẫn.

10

Chuyển đổi %c đọc ký tự đơn tiếp theo từ đầu vào, bất kể nó là gì. Trong trường hợp này, trước đây bạn đã đọc một số bằng cách sử dụng %d. Bạn phải nhấn phím enter cho số đó để đọc, nhưng bạn chưa làm gì để đọc dòng mới từ luồng đầu vào. Do đó, khi bạn thực hiện chuyển đổi %c, nó đọc dòng mới từ luồng đầu vào (mà không cần đợi bạn thực sự nhập bất kỳ thứ gì, vì đã có đầu vào đang chờ đọc).

Khi bạn sử dụng %s, nó bỏ qua bất kỳ không gian màu trắng hàng đầu nào để lấy một số ký tự khác ngoài khoảng trắng. Nó xử lý một dòng mới là không gian trắng, do đó, nó hoàn toàn bỏ qua trên đó chờ đợi dòng mới. Vì có (có lẽ) không có gì khác chờ đợi để được đọc, nó tiến tới chờ đợi cho bạn để nhập một cái gì đó, như bạn dường như mong muốn.

Nếu bạn muốn sử dụng %c cho chuyển đổi, bạn có thể đặt trước nó bằng khoảng trống trong chuỗi định dạng, cũng sẽ bỏ qua bất kỳ khoảng trắng nào trong luồng.

+0

cảm ơn thông tin –

+0

@JessicaLingmn: Chắc chắn. –

0
#include<stdio.h> 
void main() 
{ 
char another='y'; 
int num; 
while (another =='y') 
{ 
    printf("Enter a number:\t"); 
    scanf("%d", &num); 
    printf("Sqare of %d is : %d", num, num * num); 
    printf("\nWant to enter another number? y/n"); 
    getchar(); 
    scanf("%c", &another); 
} 
} 
2

Phím ENTER nằm trong luồng chuẩn, sau khi bạn nhập số cho lần quét đầu tiên% d. Phím này được chụp bởi dòng scanf% c.

sử dụng scanf("%1s",char_array); another=char_array[0];.

+1

-1 để đề xuất [hành vi không xác định] (http://c-faq.com/stdio/stdinflush.html). – Lundin

+0

Cái xấu của tôi ... chỉnh sửa câu trả lời. – anishsane

Các vấn đề liên quan