2013-07-24 46 views
6

Tôi là người mới bắt đầu trong C. Xin đừng bận tâm nếu câu hỏi của tôi bị què. Trong chương trình mà tôi đã viết, khi tôi sử dụng 'for' loop lần đầu tiên, tôi mong đợi chỉ có 3 giá trị được lưu trữ trong một mảng nhưng nó lưu trữ 4 giá trị và trong vòng lặp 'for' tiếp theo như dự kiến ​​hiển thị 3 giá trị. Câu hỏi của tôi là lý do tại sao trong vòng 1 'cho' vòng lặp phải mất 4 giá trị thay vì 3?Lưu trữ dữ liệu trong mảng từ đầu vào

#include<stdio.h> 
void main() 
{ 
    int marks[3]; 
    int i; 

    for(i=0;i<3;i++) 
    { 
     printf("Enter a no\n"); 
     scanf("%d\n",(marks+i)); 
    } 
    for(i=0;i<3;i++) 
    { 
     printf("%d\n",*(marks+i)); 
    } 
} 
+2

'khoảng trống main' là không hợp pháp. Sử dụng 'int main'. – chris

+4

xóa '\ n' trong scanf –

Trả lời

11

\n trong scanf là vấn đề

#include<stdio.h> 
int main() 
{ 
    int marks[3]; 
    int i; 

    for(i=0;i<3;i++) 
    { 
     printf("Enter a no\n"); 
     scanf("%d",(marks+i)); 
    } 

    printf("\nEntered values:\n"); 
    for(i=0;i<3;i++) 
    { 
     printf("%d\n",*(marks+i)); 
    } 

    return 0; 
} 

Lý do:

Tôi hy vọng chỉ 3 giá trị được lưu trữ trong một mảng nhưng nó sẽ lưu 4 giá trị và tiếp theo ' cho các giá trị 'vòng lặp như dự kiến ​​hiển thị 3. Câu hỏi của tôi là lý do tại sao trong vòng 1 'cho' vòng lặp phải mất 4 giá trị thay vì 3?

Đầu tiên: Không, nó chỉ cửa hàng 3 số nhưng không 4 số trong mảng marks[].

Thứ hai: thú vị khi hiểu vòng lặp chạy chỉ ba lần cho i = 0 đến i < 3. Vòng lặp for chạy theo điều kiện. Mã thú vị hơn bị kẹt trong scanf() như được mô tả bên dưới:

Sự nhầm lẫn của bạn là lý do bạn phải nhập bốn số, không phải vì vòng lặp của bạn chạy 4 lần nhưng hàm của nó chỉ trả về khi bạn nhập char không gian (và sau khi một số nhập nhấn bạn nhập một ký hiệu số là ký tự không gian).

Để hiểu hành vi này đọc hướng dẫn: int scanf(const char *format, ...);:

Một chuỗi các ký tự trắng-space (không gian, tab, xuống dòng, vv .; thấy isspace(3)). Chỉ thị này khớp với bất kỳ khoảng trắng nào, bao gồm không có khoảng trắng nào, trong mục nhập.

Bởi vì trong đầu vòng lặp for, trong scanf() bạn đã bao gồm \n trong chuỗi định dạng, vì vậy scanf() lợi nhuận chỉ khi báo chí một số nhập (hoặc một tổ chức phi không gian chính).

scanf("%d\n",(marks+i)); 
     ^
      | 
      new line char 

Điều gì xảy ra?

Giả sử đầu vào cho chương trình là:

23  <--- because of %d 23 stored in marks[0] as i = 0 
<enter> <--- scanf consumes \n, still in first loop 
543  <--- scanf returns, and leave 542 unread, 
           then in next iteration 543 read by scanf in next iteration 
<enter> 
193 
<enter> <--- scanf consumes \n, still in 3rd loop 
<enter> <--- scanf consumes \n, still in 3rd loop 
123  <--- remain unread in input stream 
+0

thanx DX nhưng khi tôi sử dụng \ n sau% d trong scanf, nó lấy 2 giá trị lần đầu tiên khi giá trị của i bằng 0 nhưng khi giá trị của tôi trở thành 1 và 2 thì chỉ mất 1, tại sao điều này xảy ra? – ranaarjun

+1

xin vui lòng đi qua http://answers.yahoo.com/question/index?qid=20110801122000AA07FO8 hy vọng điều này sẽ cho bạn biết lý do chính xác –

+1

@GrijeshChauhan chắc chắn nó sẽ hữu ích cho tất cả :) Vui lòng làm –

0

loại bỏ \ni có thể được tạo ra trong câu lệnh if như for (int i = 0; i < 3; i++) {}

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