C/C++-Programmierung



Ähnliche Dokumente
C/C++ Programmierung

Einführung in die Programmierung (EPR)

Fakultät Angewandte Informatik Lehrprofessur für Informatik

C/C++-Programmierung

Einführung in die Programmierung

Zählen von Objekten einer bestimmten Klasse

C/C++ Programmierung

Dr. Monika Meiler. Inhalt

Professionelle Seminare im Bereich MS-Office

Automatisierung ( Fernsteuerung ) von Excel unter Microsoft Windows Tilman Küpper (tilman.kuepper@hm.edu)

Übungskomplex Felder (1) Eindimensionale Felder Mehrdimensionale Felder

Übungsblatt 3: Algorithmen in Java & Grammatiken

Binäre Bäume. 1. Allgemeines. 2. Funktionsweise. 2.1 Eintragen

Programmierkurs Java

1 Vom Problem zum Programm

Tutorium Rechnerorganisation

Klausur C++ #1 Jahr: 2001; Dozent: Dipl.Ing. Sorber

Objektbasierte Entwicklung

Enigmail Konfiguration

Typumwandlungen bei Referenztypen

MSDE 2000 mit Service Pack 3a

Unterprogramme. Funktionen. Bedeutung von Funktionen in C++ Definition einer Funktion. Definition einer Prozedur

Bauteilattribute als Sachdaten anzeigen

Einführung in die C-Programmierung

Klausur in Programmieren

5 DATEN Variablen. Variablen können beliebige Werte zugewiesen und im Gegensatz zu

Felder, Rückblick Mehrdimensionale Felder. Programmieren in C

C++-Zusammenfassung. H. Schaudt. August 18, 2005

4. AUSSAGENLOGIK: SYNTAX. Der Unterschied zwischen Objektsprache und Metasprache lässt sich folgendermaßen charakterisieren:

Anleitung über den Umgang mit Schildern

Kurzanleitung. Toolbox. T_xls_Import

Programmieren in C. Macros, Funktionen und modulare Programmstruktur. Prof. Dr. Nikolaus Wulff

Der Aufruf von DM_in_Euro 1.40 sollte die Ausgabe 1.40 DM = Euro ergeben.

Strings (Zeichenketten)

Grundlagen. Kapitel 1

Grundbegriffe der Informatik

3. auf Symbol klicken erstellt von Erika Völkel

TESTEN SIE IHR KÖNNEN UND GEWINNEN SIE!

Was ist Sozial-Raum-Orientierung?

Computerarithmetik ( )

Erfahrungen mit Hartz IV- Empfängern

3D-Konstruktion Brückenpfeiler für WinTrack (H0)

Excel Funktionen durch eigene Funktionen erweitern.

Wintersemester Maschinenbau und Kunststofftechnik. Informatik. Tobias Wolf Seite 1 von 18

Zahlen und das Hüten von Geheimnissen (G. Wiese, 23. April 2009)

Pakete dienen dazu, die Software eines Projektes in größere inhaltlich zusammengehörige Bereiche mit eigenem Namen einzuteilen (siehe Java API).

Stellen Sie bitte den Cursor in die Spalte B2 und rufen die Funktion Sverweis auf. Es öffnet sich folgendes Dialogfenster

Deklarationen in C. Prof. Dr. Margarita Esponda

Wasserzeichen mit Paint-Shop-Pro 9 (geht auch mit den anderen Versionen. Allerdings könnten die Bezeichnungen und Ansichten etwas anders sein)

Sie finden im Folgenden drei Anleitungen, wie Sie sich mit dem Server der Schule verbinden können:

Übungen zu Einführung in die Informatik: Programmierung und Software-Entwicklung: Lösungsvorschlag

Erstellen einer PostScript-Datei unter Windows XP

Grundlagen von Python

PHP - Projekt Personalverwaltung. Erstellt von James Schüpbach

Tel.: Fax: Ein Text oder Programm in einem Editor schreiben und zu ClassPad übertragen.

AutoTexte und AutoKorrektur unter Outlook verwenden

Grundlagen der Informatik

II. Grundlagen der Programmierung. 9. Datenstrukturen. Daten zusammenfassen. In Java (Forts.): In Java:

ACHTUNG: Es können gpx-dateien und mit dem GP7 aufgezeichnete trc-dateien umgewandelt werden.

ecaros2 - Accountmanager

Download unter:

7 Rechnen mit Polynomen

Historical Viewer. zu ETC5000 Benutzerhandbuch 312/15

1. Einschränkung für Mac-User ohne Office Dokumente hochladen, teilen und bearbeiten

M. Graefenhan Übungen zu C. Blatt 3. Musterlösung

Anleitung zur Daten zur Datensicherung und Datenrücksicherung. Datensicherung

Einführung in die objektorientierte Programmierung mit Java. Klausur am 19. Oktober 2005

Regeln für das Qualitäts-Siegel

MORE Profile. Pass- und Lizenzverwaltungssystem. Stand: MORE Projects GmbH

-Virtuelle Jagdfliegerschule- Teamspeak Seite 1 von 6

Hochschule Darmstadt Informatik-Praktikum (INF 1) WS 2015/2016 Wirtschaftsingenieur Bachelor 5. Aufgabe Datenstruktur, Dateieingabe und -ausgabe

Informatik Kurs Simulation. Hilfe für den Consideo Modeler

Voraussetzung. Anleitung. Gehen Sie auf Start Einstellungen und suchen Sie hier den Eintrag Datenverbindungen oder Verbindungen. Öffnen Sie diesen.

IINFO Storyboard

Anleitung zum GEPA EXCEL Import Tool

Gibt Daten im erweiterten Format aus. Dies beinhaltet die Angabe von Zugriffsrechten, Besitzer, Länge, Zeitpunkt der letzten Änderung und mehr.

Programmiersprachen und Übersetzer

Umwandeln und Exportieren von Adobe-Illustrator-Dateien in Illustrator für Artcut

2 Einfache Rechnungen

Funktionen Häufig müssen bestimmte Operationen in einem Programm mehrmals ausgeführt werden. Schlechte Lösung: Gute Lösung:

Fachdidaktik der Informatik Jörg Depner, Kathrin Gaißer

10 Lesen und Schreiben von Dateien

Viele Bilder auf der FA-Homepage

Benutzer- und Rechte-Verwaltung Teil 3

Web-Kürzel. Krishna Tateneni Yves Arrouye Deutsche Übersetzung: Stefan Winter

Kleines Handbuch zur Fotogalerie der Pixel AG

Die Programmiersprache C99: Zusammenfassung

Installation des Add-Ins für Lineare Algebra in Microsoft Excel

kleines keyword brevier Keywords sind das Salz in der Suppe des Online Marketing Gordian Hense

Informatik 2 Labor 2 Programmieren in MATLAB Georg Richter

Anleitung zum erstellen einer PDF-Datei aus Microsoft Word

Backup der Progress Datenbank

Wintersemester Maschinenbau und Kunststofftechnik. Informatik. Tobias Wolf Seite 1 von 16

FILE *fp; char fname[100];... fp = fopen (fname, rb ); if( fp == NULL ) { perror( fopen );... } // Fehlernachricht auf letzten Fehler, der aufkam

Matrix42. Matrix42 Cloud Trial Erste Schritte. Version

Computeria Solothurn

PVL 3 - Roulette. (5 Punkte) Abgabe bis

Standard-Kontaktformular

Java: Vererbung. Teil 3: super()

Transkript:

1 C/C++-Programmierung Aufzählungen, Zeichenketten Sebastian Hack Christoph Mallon (hack mallon)@cs.uni-sb.de Fachbereich Informatik Universität des Saarlandes Wintersemester 2009/2010

2 Aufzählungen enumerations, C: 6.7.2.2, C++: 7.2 Symbolische Namen für ganzzahlige Konstanten Jede Aufzählung ist ein eigener Typ Dahinterliegender Typ ist implementierungsabhängig Muss ein Ganzzahltyp sein Typname wieder nur mit Präfix enum verwendbar Unterschied bei Typ von Aufzählungswerten C: int C++: Aufzählungstyp Aufzählungen können implizit in normale Zahlen umgewandelt werden Zahlen können implizit in Aufzählungen umgewandelt werden (nicht C++)

3 Beispiel: enum enum Meme { FIRST_POST, /* Erster Eintrag ohne * expliziter Wert : 0 */ EPIC_ FAIL = -1, FACEPALM = -1, // Duplikate moeglich LEET = 1337, NINETHOUSAND = 9000, OVER9000 // voriger Eintrag + 1: 9001 };

4 Beispiel: enum als Bitflags typedef enum AccessPermissions { USER_ READ = 0400, USER_ WRITE = 0200, USER_ EXEC = 0100, USER_ RXW = USER_ READ USER_ WRITE USER_EXEC, GROUP_ READ = 0040, GROUP_ WRITE = 0020, GROUP_ EXEC = 0010, GROUP_ RWX = 0070, OTHER_ READ = 0004, OTHER_ WRITE = 0002, OTHER_ EXEC = 0001, OTHER_ RWX = 0007, // Komma hier seit C99 erlaubt } Perm ; Perm x = USER_ READ USER_ WRITE ; // OK in C, nicht C ++

5 Beispiel: Arbeiten mit Bitflags x = USER_ EXEC ; // Bit setzen ( nicht C ++) x ^= GROUP_ WRITE ; // Bit kippen ( nicht C ++) x &= ~ OTHER_ RWX ; // Bits loeschen ( nicht C ++) if ( x & USER_ READ ) // Bit testen printf (" Besitzer darf lesen ");

6 Zeichenketten Zeichenkettenverarbeitung kein Sprachelement, wird mittels Bibliotheksfunktionen realisiert Per Konvention sind Zeichenketten NUL-terminiert ( \0 ) Beschränkung: Zeichenketten können kein NUL enthalten Manchmal ASCIIZ genannt Nur etwas syntaktischer Zucker für Zeichenkettenliterale

7 Zeichenkettenliterale String Literals " Hallo \n" Sind einfach Reihungen von char NUL wird am Ende automatisch ergänzt Fast äquivalent zu char eindeutiger_ name [] = { H, a, l, l, o, \n, \0 }; Elementtyp ist char, aber Inhalt darf nicht verändert werden Sonst verhalten undefiniert In C++ Elementtyp char const und veraltete Umwandlung nach char* erlaubt Gleiche Zeichenkettenliterale können (aber müssen nicht) vom Übersetzer zusammengelegt werden

8 Zeichenkettenliterale und Reihungen/Zeiger char a[] = { H, a, l, l, o, \n, \0 }; char a[] = { " Hallo \n" }; char a[] = " Hallo \n"; // {} kann weggelassen werden // Andere Bedeutung! char * p = " Hallo \n"; Syntaktischer Zucker: Reihungen von char können mit Zeichenkettenliteralen initialisiert werden

9 Zeichenkettenverarbeitung 7.21.2.3, 7.21.3.1 char * strcpy ( char * dst, char const * src ); char * strcat ( char * dst, char const * src ); size_t strlen ( char const *); Header <string.h> Zeichketten müssen immer NUL-terminiert sein Generell: Ziel und Quelle dürfen sich nicht überlappen, sonst Verhalten undefiniert Bei unvorsichtiger Benutzung Pufferüberläufe möglich z.b. Benutzereingaben Alle Namen beginnend mit str gefolgt von einem Kleinbuchstaben sind reserviert

10 strncpy(): Sichere Alternative? 7.21.2.4 char * strncpy ( char * dst, char const * src, size_t n); Kopiert nicht mehr als n Zeichen nach dst Wenn src kürzer, wird Rest mit NUL-Zeichen gefüllt Achtung: NUL-Terminierung ist nicht garantiert!

11 strncat(): Sichere Alternative? 7.21.3.2 char * strncat ( char * dst, char const * src, size_t n); Hängt nicht mehr als n weitere Zeichen an bestehende Zeichenkette dst an Wenn src kürzer, wird Rest mit NUL-Zeichen gefüllt Achtung: Bedeutung von n abstrus man muss wissen wie lang die Zeichenkette an dst bereits ist! char buf [128]; strncpy (buf, " Hallo ", sizeof ( buf )); if ( buf [ sizeof ( buf ) - 1]!= \0 ) abort (); // Buffer too small //!!! strncat (buf, " Welt!", sizeof ( buf ) - strlen ( buf )); if ( buf [ sizeof ( buf ) - 1]!= \0 ) abort (); // Buffer too small

12 Sichere Alternative: strl*() size_t strlcpy ( char * dst, char const * src, size_t n); size_t strlcat ( char * dst, char const * src, size_t n); n ist Größe des Zielpuffers Es wird nie eine Zeichenkette von mehr als n - 1 Zeichen erzeugt Wird immer NUL-terminiert Gibt Länge der Zeichenkette zurück, die versucht wurde zu erzeugen Einfach prüfbar, ob Puffer zu klein ist Nachteil: Leider nicht normiert

13 strcmp(): Lexikographischer Vergleich int strcmp ( const char * s1, const char * s2 ); Gibt Zahl kleiner/gleich/größer 0 zurück, wenn s1 kleiner/gleich/größer s2 Vergleich abhängig von gewählter Lokalisierung Normalfall "C" Heutzutage effektiv ASCII-betisch

Variadische Funktionen 6.7.5.3:9, 7.15 # include <stdarg.h> void f( int x,...) // Ellipse ( Auslassung ) { va_list ap; va_start (ap, x); /*... */ TYPE a = va_arg ( ap, TYPE ); /*... */ va_end (ap ); } va_start: zweites Argument muss letzter formaler Parameter sein va_arg: Holt nächstes variadisches Argument Angegebener Typ muss mit dem Typ des übergebenen Arguments übereinstimmen Bei Ganzzahlentypen: mindestens int Bei Gleitkommazahlentypen: mindestens double 14

15 *printf() int printf ( char const * fmt,...); int fprintf ( FILE *, char const * fmt,...); int sprintf ( char * buf, char const * fmt,...); int snprintf ( char * buf, size_t n, char const * fmt,...); Funktionsfamilie zur Formatierung von Text printf(): Ausgabe auf Bildschirm fprintf(): Ausgabe in Datei sprintf(): Ausgabe in Zeichenkette + NUL snprintf(): Mit Größenangabe des Puffers, es werden nicht mehr als n 1 Zeichen + NUL geschrieben Rückgabewert: Je Anzahl der geschriebenen Zeichen Bei s*printf() ohne NUL Bei snprintf() wenn Puffer groß genug wäre

16 v*printf() int vprintf ( char const * fmt, va_list ); int vfprintf ( FILE *, char const * fmt, va_list ); int vsprintf ( char * buf, char const * fmt, va_list ); int vsnprintf ( char * buf, size_t n, char const * fmt, va_list ); Letzter Parameter bereits vorbereitete Argumentenliste statt Ellipse void dbg_ printf ( char const * fmt,...) { printf (" DEBUG : "); va_list ap; va_start (ap, fmt ); vprintf (fmt, ap ); va_end (ap ); }

17 wchar t # include <stddef.h> # include <stdio.h> # include < wchar.h > // wchar_t - Funktionen wprintf (L" Hallo, % lcelt \n", L W ); Vorangestelltes L Zeichenvorrat umfasst mindestens den von char wchar_t definiert in <stddef.h> für C, eingebauter Typ in C++ Üblicherweise UCS-2 (16 Bit) oder UCS-4 (32 Bit) Verarbeitungsfunktionen haben w (wprintf(), swprintf()) oder wcs (wcscpy(), wcslen()) im Namen Achtung: wchar_t- und char-funktionen auf selbem Ausgabestrom nicht mischen! ( 7.19.2:5)

18 Verkettung von Zeichenkettenliteralen // Aequivalent " Hallo, Welt!" " Hallo," " Welt!" L" hello, world " L" hello, wo" L" rld " // Auch gemischt ( ab C99 ) L" hell " "o, world " " hello " L", world " Ergebnis ist wchar_t[], wenn mindestens ein Teil wchar_t[] ist printf (" Version :" # ifndef NDEBUG " ( DEBUG )" # endif " 3.14159 ");