\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
'khoảng trống main' là không hợp pháp. Sử dụng 'int main'. – chris
xóa '\ n' trong scanf –