变量的内容意外地发生变化?

时间:2016-08-30 09:44:36

标签: c variables

#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很陌生,所以可能还有一些我不清楚的事情,但我非常愿意了解它们。

2 个答案:

答案 0 :(得分:3)

如果你sizeof designator,你会看到它的大小只有一个字节。其内容将是单个字符'\0'(字符串终止符)。这是因为你初始化它的方式。

如果创建的数组没有明确的大小,编译器将从用于初始化数组的任何数据中推断出大小。由于您使用空字符串初始化它,因此它将包含空字符串,并且它将具有它将具有的大小。

因此,您将写出数组的界限,这将导致未定义的行为

您需要显式设置数组的大小,大小足以包含要复制到其中的最大字符串。

E.g。

char designator[128] = "";

答案 1 :(得分:0)

数值变量的值可能会更改,因为您将字节复制到某个位置(designator),但没有足够的空间可能会覆盖它们。