Развернуть размер вашего q1
буфера. scanf("%s", q1)
не хватает места для хранения ввода. Помните, что C использует пустой символ '\0'
для прекращения строк. Если вы не учтете это, буфер может переполняться в другую память, вызывая undefined behavior. В этом случае это, вероятно, переписывает память, выделенную для name
, поэтому name
заканчивается, указывая на «\ 0ick». Это вызывает printf(%s)
, который ищет '\0'
, чтобы узнать, когда прекратить печать, подумать, что строка короче, чем есть на самом деле.
код работает отлично, если вы расширяете буфер:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
int main(void)
{
char name[50];
char q1[50];
printf(" What is your name?\n");
scanf("%49s", name);
printf(" Hi %s, Do you want to have some fun? [Y/N]\n",name);
scanf("%49s",q1);
if(strcmp(q1,"Y") == 0||strcmp(q1,"y")==0)
{
printf("Awesome, let's play!\n");
}
else
{
printf("Fine");
}
printf("So %s, it's time to get started\n", name);
getchar();
return 0;
}
Выход:
What is your name?
Nick
Hi Nick, Do you want to have some fun? [Y/N]
y
Awesome, let's play!
So Nick, it's time to get started
Обратите внимание, что я добавил спецификатор %49s
, чтобы избежать переполнения буфера, как это.
Вы можете также обойти необходимость другой строки полностью изменив char q1[50]
и scanf("%49s")
не просто char q1
и scanf("%c%*c", &q1)
(обратите внимание на «адрес» оператора, потому что q1
больше не является указателем).
Возможно, вы даже получите выигрыш в производительности от этого (хотя и небольшой), потому что строки являются печально известными хоггерами памяти. Сравнение одного символа обычно предпочтительнее сравнения строк.
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
int main(void)
{
char name[50];
char q1;
printf(" What is your name?\n");
scanf("%49s%*c", name);
printf(" Hi %s, Do you want to have some fun? [Y/N]\n",name);
scanf("%c%*c",&q1);
if(q1 == 'Y' || q1 == 'y')
{
printf("Awesome, let's play!\n");
}
else
{
printf("Fine");
}
printf("So %s, it's time to get started\n", name);
getchar();
return 0;
}
if(q1 == 'Y' || q1 == 'y')
{
printf("Awesome, let's play!\n");
}
else
{
printf("Fine");
}
printf("So %s, it's time to get started\n", name);
getchar();
return 0;
}
Если вы идете по этому пути, вы должны игнорировать клавишу ввода с помощью спецификатора формата %*c
, потому что нажатие кнопки ENTER посылает ключ к потоку, а также.
что 'q1', точно ? –
'scanf ("% s ", name);' -> 'scanf ("% 49s ", name);' –
Я добавил 'char q1 [50];' и он работает для меня. – moffeltje