【问题标题】:C enum Printing error?C枚举打印错误?
【发布时间】:2014-12-05 16:36:09
【问题描述】:

在大学里,我们必须编写一个包含结构、枚举和联合的程序来显示日期, 比如 2014 年 9 月 1 日。 我在打印枚举时遇到了一些问题。我在这个论坛中找到了一些解决方案,最后我再也没有控制台错误了。但是每次我尝试运行我的程序时它都会崩溃。 也许你们中的某些人知道导致崩溃的原因:

#include <stdio.h>

    enum Monate{JANUAR = 1,
                FEBRUAR = 2,
                MAERZ = 3,
                APRIL = 4,
                MAI = 5,
                JUNI = 6,
                JULI = 7,
                AUGUST = 8,
                SEPTEMBER = 9,
                OKTOBER = 10,
                NOVEMBER = 11,
                DEZEMBER = 12 };

    union Monat{
        enum Monate alsMonat;
        char alsZahl;
        char alsString[10];
    };

    struct Datum {
        char tag;
        union Monat monat;
        short jahr;
    };


const char* welcherMonat(enum Monate meinMonat){
    switch(meinMonat){
            case JANUAR: return"Januar";
            break;

            case FEBRUAR: return"Februar";
            break;

            case MAERZ: return"Maerz";
            break;

            case APRIL: return"April";
            break;

            case MAI: return"Mai";
            break;

            case JUNI: return"Juni";
            break;

            case JULI: return"Juli";
            break;

            case AUGUST: return"August";
            break;

            case SEPTEMBER: return"September";
            break;

            case OKTOBER: return"Oktober";
            break;

            case NOVEMBER: return"November";
            break;

            case DEZEMBER: return"Dezember";
            break;
        }
}

void ausgabe(struct Datum *datum){
    char month[10]=" ";
    printf("Tag: %c\n",(*datum).tag);

    enum Monate monat2=(*datum).monat.alsMonat;
    printf("Monat: %s\n",welcherMonat(monat2));
    printf("Jahr: %d\n\n",(*datum).jahr);

}


int main(int argc, char** argv){

    struct Datum Geburtstag = {'3',AUGUST,1995};
    struct Datum Heute = {'3','12',2014};
    struct Datum Millenium = {'1',1,2000};

        ausgabe(&Geburtstag);
        ausgabe(&Heute);
        ausgabe(&Millenium);

    return 0;
}

【问题讨论】:

  • 附注:1.return之后不需要break,2.(*foo).bar最好写成foo-&gt;bar
  • 另外,在调试器中运行你的程序,看看它在哪一行崩溃。
  • 你能发布堆栈跟踪吗?
  • '12',一个多字节字符文字,与您的welcherMonat() 函数中的任何枚举标记都不匹配,这导致该函数返回一个垃圾值,printf() 得到一点点脾气暴躁...
  • 在英文帮助环境中寻求帮助之前,在代码中使用英文。

标签: c struct enums unions


【解决方案1】:

使用 GDB。它是 Gnu 调试器。在启用-g 选项的情况下编译您的代码,它将包含所有正确的调试符号。然后,您可以使用 GDB 在程序中手动设置中断,并一次单步执行一行,查看变量,并准确了解崩溃的位置。

【讨论】:

  • 为什么谢谢你。很高兴知道其他人欣赏 GDB 的强大功能。我认为我的“关于我”部分对此有所说明。
  • 只是有一半发布问题的人似乎不知道如何调试。学校似乎也不教它
【解决方案2】:

你怎么会有这样的多字符字符:

struct Datum Heute = {'3','12',2014};

您的编译器不会为此发出警告吗?理想情况下应该

【讨论】:

  • '12' 是合法的,但它的值是实现定义的。这是一个几乎没用的语言功能。
  • @KeithThompson 我的编译器为此抛出了一个错误,而且我们看到一个联合被初始化为一个不正确的 char 常量?
  • 这就是它失败的地方,但struct Datum Heute = {'3',12,2014}; 有效。但是该函数并没有捕获所有内容(没有default),这是我的编译器发出的警告。
  • @KeithThompson 抱歉不是错误警告warning: multi-character character constant
  • Visual C: 警告 C4715: 'welcherMonat' : 并非所有控制路径都返回值
【解决方案3】:

似乎我忽略了 MultiCharacter 警告... 当我选择一个字符的月份时,它仍然会在第二次打印时冻结,而我想使用 char 作为月份来打印日期。其他两种类型的打印月份(按枚举)工作得很好。 我们的任务是使用所有三种月份打印来打印三个不同的日期。

我想我知道问题所在:

enum Monate monat2=(*datum).monat.alsMonat;
printf("Monat: %s\n",welcherMonat(monat2));

当我给函数一个字符而不是枚举时,“monat2”是空的。 但是我如何检查我是给他一个字符还是一个枚举?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-05
    • 2016-12-30
    • 1970-01-01
    • 2023-02-25
    • 2021-04-17
    • 1970-01-01
    相关资源
    最近更新 更多