#include <stdio.h>
#include <string.h>
main()
{
int h, m;
char designator[] = "";
printf("Please enter the hours: ");
scanf("%d", &h);
if (h < 0 || h > 23)
{
printf("Please enter a proper time!");
}
else
{
printf("Please enter the minutes: ");
scanf("%d", &m);
if (m > 59 || m < 0)
{
printf("Please enter a proper time!");
}
else if (h == 0 && m == 0)
{
strcpy(designator, "midnight");
}
else if (h == 12 && m == 0)
{
strcpy(designator, "noon");
}
else if (h == 0)
{
strcpy(designator, "am");
h = h + 12;
}
else if (h < 12)
{
strcpy(designator, "am");
}
else if (h > 12)
{
strcpy(designator, "pm");
h = h - 12;
}
printf("The time is: %d:%d %s", h, m, designator);
}
}
你好!当我运行此代码时,我得到一个非常意外的输出。变量(特别是m)不应该改变。使用scanf()将它们作为输入,但我无意更改它们。我假设变量有问题或者是if,但实际上我不知道我的代码有什么问题:/
这是命令行中出现的内容:
请输入时间:23
请输入会议记录:15
时间是:11:109 pm
我试图找出&#34; 109&#34;是来自但我不知道任何线索。我对C很陌生,所以可能还有一些我不清楚的事情,但我非常愿意了解它们。
答案 0 :(得分:3)
如果你sizeof designator
,你会看到它的大小只有一个字节。其内容将是单个字符'\0'
(字符串终止符)。这是因为你初始化它的方式。
如果创建的数组没有明确的大小,编译器将从用于初始化数组的任何数据中推断出大小。由于您使用空字符串初始化它,因此它将包含空字符串,并且它将具有它将具有的大小。
因此,您将写出数组的界限,这将导致未定义的行为。
您需要显式设置数组的大小,大小足以包含要复制到其中的最大字符串。
E.g。
char designator[128] = "";
答案 1 :(得分:0)
数值变量的值可能会更改,因为您将字节复制到某个位置(designator
),但没有足够的空间可能会覆盖它们。