#include <stdio.h>
main()
{
int n,i;
FILE *fptr;
fptr=fopen("f3.txt","w");
if(fptr==NULL)
{
printf("Error!");
exit(1);
}
printf("Enter n: ");
for(i=0;i<=2;i++)
{
scanf("%d \n",&n);
fprintf(fptr,"%d ",n);
}
fclose(fptr);
return 0;
}
РЕДАКТИРОВАТЬ: *В вышеупомянутой программе я ввожу 3 значения, но почему это запрашивает 4 значения? Хотя его написание только три раза, но его просит значения 4 раза. Можете ли вы сказать причину? И что нужно сделать, чтобы оно приняло точное количество значений, которые я набираю.?* заранее спасибо..
Так что известно, что это произошло из-за пробела рядом с% d в цикле. Может кто-нибудь объяснить Возврат каретки в мельчайших подробностях, я искал, но не мог точно понять, что это такое.
Вы вводите не 4 значения, а 3. for
оператор проходит через 0, 1 и 2. Если кажется, что он запрашивает у вас 4 значения из-за строки формата, которую вы использовали в scanf()
, Просто используйте "%d"
без пробела и \n
,
Кроме того, могу ли я предложить вам повторить printf ("Enter n: ");
как раз перед scanf()
и не только в начале вашей программы? Таким образом, вы быстро поймете, когда программа запрашивает данные или когда scanf()
только что застрял в ожидании некоторых завершающих данных, например, возврата каретки, чтобы принять предыдущие данные.
Если вы измените printf
как я говорю вам, и не меняйте формат строки в scanf()
, вы поймете, что ваша программа запрашивает первый номер, затем запрашивает возврат каретки (вы думали, что здесь запрашивается номер, и вводите один, ваш «второй» номер), а затем запрашивает второй номер (третий номер для вас, но это scanf()
примет второй, который вы ранее ввели), а затем для третьего номера (четвертый для вас, но это scanf()
примет предыдущий третий введенный номер). Это 4 ввода от пользователя, и это то, что вас смутило.
Чтобы попытаться объяснить, что происходит с вашим scanf (), как у вас изначально, я написал программу, основанную на вашей, но с несколькими дополнениями:
#include <stdio.h>
int main()
{
int n,i,c;
for(i=0;i<=2;i++)
{
printf (" scanf #%d (%%d) \n", i+1);
scanf("%d",&n);
printf (" Read: %d\n",n);
c = getchar();
printf (" Last character in input buffer: %.2X\n", c);
printf (" scanf #%d (space and \\n) \n", i+1);
scanf(" \n"); /* or \t or just the space, or just \n */
c = getchar();
printf (" Last character in input buffer: %.2X\n", c);
ungetc (c, stdin);
}
return 0;
}
Каждый раз, когда программа останавливается, пользователь вводит число: 1,2,3,4, … Последовательность getchar/ungetch
заглядывает в буфер ввода, чтобы увидеть, что будет первым scanf()
найду. Я также разделил ваш scanf()
на два вызова: первый с использованием %d
а второй с использованием остальной части строки формата (пробел и / или \n
). Обратите внимание, что \ n рассматривается как пробел. На самом деле, оба являются частью так называемого пустые символы так что любой из них ведет себя одинаково, и более одного пробела ведет себя так, как будто есть только один пробел)
Вот что происходит (цифры слева — это цифры, которые я ввожу с клавиатуры):
scanf #1 (%d)
1
Read: 1
Last character in input buffer: 0A
scanf #1 (space and \n)
2
Last character in input buffer: 32
scanf #2 (%d)
Read: 2
Last character in input buffer: 0A
scanf #2 (space and \n)
3
Last character in input buffer: 33
scanf #3 (%d)
Read: 3
Last character in input buffer: 0A
scanf #3 (space and \n)
4
Last character in input buffer: 34
END OF PROGRAM
Сравните этот вывод с этим:
scanf #1 (%d)
1 2 3 4 <-- I enter 4 numbers at the first prompt, instead of one at a time
Read: 1
Last character in input buffer: 20
scanf #1 (space and \n)
Last character in input buffer: 32
scanf #2 (%d)
Read: 2
Last character in input buffer: 20
scanf #2 (space and \n)
Last character in input buffer: 33
scanf #3 (%d)
Read: 3
Last character in input buffer: 20
scanf #3 (space and \n)
Last character in input buffer: 34
END OF PROGRAM
измените цикл for на, тогда вы можете ввести 4 значения
for(i=0;i<=3;i++)
{
scanf("%d \n",&n);
fprintf(fptr,"%d ",n);
}
попробуй это
#include <stdio.h>
main()
{
int n,i;
FILE *fptr;
fptr=fopen("f3.txt","w");
if(fptr==NULL)
{
printf("Error!");
exit(1);
}
printf("Enter n: ");
for(i=0;i<=3;i++)
{
scanf("%d \n",&n);
fprintf(fptr,"%d ",n);
}
fclose(fptr);
return 0;
}
Ваш код принимает только 3 значения, а не 4.
для (я = 0; я<= 2; я ++)
вышеуказанный цикл выполняется для 0, 1 и 2, то есть 3 раза.
for(i=0;i<=2;i++)
только 3 раза, измените его на for(i=0;i<4;i++)
и ответ на ваши правки :: изменить scanf("%d \n",&n);
в scanf("%d",&n);
(определите разницу в пространстве после %d
).