我是C语言的新手,正在测试一个简单的if语句程序,根据你的年龄和性别从4个不同的结果中找出答案。
这是这样的:如果你未满55岁并且是男性,它将打印出:“你是一个处于最佳年龄的男人!”
但是我遇到了一个错误代码:运行时检查失败#2 - 变量'miesVaiNainen'周围的堆栈已损坏。
我自己,认为它可能与某些事情有关:if (manOrFemale == "f" && age <= 55)
我该如何解决这个问题,以免出错?
我试图在stackoverflow中寻求帮助,并尝试更改代码。
int age;
char manOrFemale;
printf("Are you a man or a female(m/f)");
scanf("%s", &manOrFemale);
printf("Input age:");
scanf("%d", &age);
if (manOrFemale == "f" && age <= 55)
{
printf("\nYou are a lady at her best!");
} else if (manOrFemale == "f" && age >= 56)
{
printf("\nYou look young for your age!");
}
if (manOrFemale == "m" && age <= 55)
{
printf("\nYou are a man at his best age!");
} else if (manOrFemale == "m" && age >= 56)
{
printf("\nYou are a wise man!");
} else {
printf("There has been an error in the program!");
}
}
截至目前,您正在使用%s
说明符来阅读char
。你需要使用%c
说明符来读取char
,%s
是用于char *
。
scanf(" %c", &manOrFemale);
和
你需要使用单引号来比较chars
。截至目前,您正在将char
与指针进行比较。
if (manOrFemale == 'f'; && age <= 55)
这是一个非常大的问题:
scanf("%s", &manOrFemale);
变量manOrFemale
是单个字符。格式"%s"
用于读取以null结尾的字节字符串。
只有一个字符的字符串需要两个字符的空间,以适应空终止符。由于你没有终结器的空间,scanf
函数将写入你不拥有的内存,破坏堆栈(编译器通常存储局部变量)导致你得到的错误。
如果要读取单个字符,请使用"%c"
格式,如
scanf(" %c", &manOrFemale);
请注意格式字符串中的前导空格,需要忽略可能的前导空格(如任何先前输入的换行符)。
另请注意,通过比较manOrFemale == "f"
,您可以将manOrFemale
中的单个字符与字符串"f"
进行比较。 C中的文字字符串实际上是一个只读字符数组,并且任何数组都会衰减到指向其第一个元素的指针。因此,您不是在比较字符,而是将字符与指针进行比较。
您的编译器应该已经警告过您。
要解决这个问题,你需要比较一个字符:manOrFemale == 'f'
。请注意使用单引号。
最后一个更风格的说明......
声明
if (manOrFemale == 'f' && age <= 55)
{
printf("\nYou are a lady at her best!");
} else if (manOrFemale == 'f' && age >= 56)
{
printf("\nYou look young for your age!");
}
可以改写为
if (manOrFemale == 'f')
{
if (age <= 55)
printf("You are a lady at her best!\n");
else
printf("You look young for your age!\n");
}
这里要注意的另一件事是我在输出中使用尾随换行符。这是因为否则在程序完成后可能没有换行符(因此输出似乎与命令行提示混合),但也因为输出到stdout
(printf
写入)默认是行缓冲的。行缓冲意味着输出在内部缓冲,并且在缓冲区已满或写入换行符之前不会实际写入终端。如果在输出中使用前导换行符,则将写入上一行,而不是当前行。