int main()
{
enum Days{Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday};
Days TheDay;
int j = 0;
printf("Please enter the day of the week (0 to 6)\n");
scanf("%d",&j);
TheDay = Days(j);
//how to PRINT THE VALUES stored in TheDay
printf("%s",TheDay); // isnt working
return 0;
}
86
Antworten:
Aufzählungen in C sind Zahlen, deren Code bequeme Namen enthält. Sie sind keine Zeichenfolgen, und die ihnen im Quellcode zugewiesenen Namen werden nicht in Ihr Programm kompiliert, sodass Sie zur Laufzeit nicht darauf zugreifen können.
Der einzige Weg, um das zu bekommen, was Sie wollen, besteht darin, selbst eine Funktion zu schreiben, die den Aufzählungswert in eine Zeichenfolge übersetzt. ZB (vorausgesetzt, Sie verschieben hier die Deklaration von
enum Days
außerhalb vonmain
):Alternativ können Sie ein Array als Karte verwenden, z
Aber hier möchten Sie wahrscheinlich aus
Sunday = 0
Sicherheitsgründen die Aufzählung zuweisen ... Ich bin mir nicht sicher, ob der C-Standard verlangt, dass Compiler Aufzählungen von 0 beginnen, obwohl die meisten dies tun (ich bin sicher, dass jemand einen Kommentar abgeben wird, um dies zu bestätigen oder abzulehnen ).quelle
const char* dayNames[] = {[Sunday] = "Sunday", [Monday] = "Monday", [Tuesday] = "Tuesday", /* ... etc ... */ };
. Sie wissen, falls die Wochentage neu geordnet werden, oder Sie entscheiden, dass Montag der erste Tag der Woche ist.Days TheDay = Monday; printf("%s", #TheDay);
"TheDay" drucken.Ich benutze so etwas:
in einer Datei "EnumToString.h":
Dann geben Sie in jeder Header-Datei die Enum-Deklaration day enum.h ab
dann in einer Datei namens EnumToString.c:
dann in main.c:
Dadurch werden "automatisch" die Zeichenfolgen für alle auf diese Weise deklarierten und in "EnumToString.c" enthaltenen Aufzählungen generiert.
quelle
return _(#element)
und dergleichen ändern .Normalerweise speichere ich die Zeichenfolgendarstellungen in einem separaten Array in derselben Reihenfolge und indiziere das Array dann mit dem Aufzählungswert:
quelle
enum
s in C funktionieren nicht so, wie Sie es erwarten. Sie können sich diese wie verherrlichte Konstanten vorstellen (mit einigen zusätzlichen Vorteilen, die sich aus der Sammlung ergeben solcher Konstanten), und der Text, den Sie für "Sonntag" geschrieben haben, wird während der Kompilierung wirklich in eine Zahl aufgelöst letztendlich verworfen.Kurz gesagt: Um das zu tun, was Sie wirklich wollen, müssen Sie ein Array der Zeichenfolgen beibehalten oder eine Funktion erstellen, um den Wert der Aufzählung dem Text zuzuordnen, den Sie drucken möchten.
quelle
Aufzählungen in C sind im Grunde genommen syntaktischer Zucker für benannte Listen automatisch sequenzierter ganzzahliger Werte. Das heißt, wenn Sie diesen Code haben:
Ihr Compiler spuckt tatsächlich Folgendes aus:
Daher ist die Ausgabe einer C-Aufzählung als Zeichenfolge für den Compiler keine sinnvolle Operation. Wenn Sie für diese lesbare Zeichenfolgen haben möchten, müssen Sie Funktionen definieren, die von Aufzählungen in Zeichenfolgen konvertiert werden sollen.
quelle
Hier ist eine sauberere Möglichkeit, dies mit Makros zu tun:
Ich bin nicht sicher, ob dies vollständig tragbare s / w-Präprozessoren sind, aber es funktioniert mit gcc.
Dies ist übrigens c99, also verwenden
c99 strict
Sie es, wenn Sie es an (den Online-Compiler) ideone anschließen .quelle
Ich weiß, dass ich zu spät zur Party komme, aber wie wäre es damit?
Auf diese Weise müssen Sie das
enum
und daschar*
Array nicht manuell synchron halten. Wenn Sie wie ich sind, besteht die Möglichkeit, dass Sie das später ändernenum
und daschar*
Array ungültige Zeichenfolgen druckt. Dies ist möglicherweise keine allgemein unterstützte Funktion. Aber afaik, die meisten modernen C-Compiler unterstützen diesen designierten Initialisierungsstil.Weitere Informationen zu bestimmten Initialisierern finden Sie hier .
quelle
Die Frage ist, Sie möchten den Namen nur einmal schreiben.
Ich habe einen Ider wie diesen:
Es verwendet eine Struktur, um eine Aufzählung einzufügen, sodass ein Drucker, der eine Zeichenfolge enthält, jedem definierten Aufzählungswert folgen kann.
>error is get_other_string, number is -203
Der Unterschied zu enum ist, dass der Builder keinen Fehler melden kann, wenn die Zahlen wiederholt werden. Wenn Sie keine Schreibnummer mögen, können Sie diese
__LINE__
ersetzen:>day Wednesday, number is 3
>day Monday, number is 1
quelle
Ich bin neu in diesem Bereich, aber eine switch-Anweisung wird auf jeden Fall funktionieren
quelle
Ich mag es, wenn die Tagesnamen eine Aufzählung enthalten. Um die Eingabe zu reduzieren, können wir Folgendes tun:
quelle
TheDay wird einem ganzzahligen Typ zugeordnet. So:
Versucht, TheDay als Zeichenfolge zu analysieren, und druckt entweder Müll aus oder stürzt ab.
printf ist nicht typsicher und vertraut darauf, dass Sie den richtigen Wert an übergeben. Um den Namen des Werts auszudrucken, müssen Sie eine Methode zum Zuordnen des Aufzählungswerts zu einer Zeichenfolge erstellen - entweder eine Nachschlagetabelle, eine riesige switch-Anweisung usw.
quelle