C-Funktionen Beschreibung der C-Funktionen in Aufbau und Anwendung - Anwenderhandbuch - für C - Programmierung Dipl.-Ing. Siegfried Meyer (†) Dr. Stefano Ianigro Universität der Bundeswehr Hamburg 14. Februar 2022 1 Das Handbuch enthält Informationen über C - Funktionen der verschiedenen C - Derivate mit Hinweisen zur Anwendung. Zusammenfassung Schriftenreihe zur C-Programmierung Inhaltsverzeichnis 1 Einleitung 3 2 C-Präprozessor 5 2.1 #include-Direktive . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 2.2 Symbolische Konstanten . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 2.3 Makro . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 2.4 Bedingte Übersetzung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 2.4.1 Beispiel - Bedingte Übersetzung - . . . . . . . . . . . . . . . . . . . . 8 Wichtige Include-Dateien . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 2.5 3 Bibliotheksroutinen 11 3.1 Bibliotheksroutinen - Übersicht . . . . . . . . . . . . . . . . . . . . . . . . . 12 3.1.1 Klassifizierungsroutinen - ASCII-Zeichen . . . . . . . . . . . . . . . 12 3.1.2 Konvertierungsroutinen . . . . . . . . . . . . . . . . . . . . . . . . . 13 3.1.3 Verzeichnisroutinen . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 3.1.4 Diagnoseroutinen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 3.1.5 I/O-Routinen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 3.1.6 DOS/8086/BIOS-Routinen . . . . . . . . . . . . . . . . . . . . . . . 15 3.1.7 String- und Speichermanipulation . . . . . . . . . . . . . . . . . . . 16 3.1.8 Mathematische Routinen . . . . . . . . . . . . . . . . . . . . . . . . 17 3.1.9 Dynamische Verwaltung des Speichers . . . . . . . . . . . . . . . . 18 3.1.10 Diverses . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18 3.1.11 Prozeßroutinen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18 3.1.12 Standardroutinen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 3.1.13 Datum und Uhrzeit . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20 3.1.14 Variable Argumente . . . . . . . . . . . . . . . . . . . . . . . . . . . 20 1 2 4 INHALTSVERZEICHNIS Funktionen 21 4.1 abort() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22 4.2 abs() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23 4.3 acos() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24 4.4 asctime() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26 4.5 asin() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28 4.6 assert() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30 4.7 atan() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32 4.8 atan2() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34 4.9 atexit() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36 4.10 atof() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38 4.11 atoi() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40 4.12 atol() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42 4.13 bsearch() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44 4.14 calloc() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46 4.15 ceil() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48 4.16 chdir() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50 4.17 chmod() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52 4.18 clearerr() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54 4.19 clock() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55 4.20 close() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56 4.21 cos() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58 4.22 cosh() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60 4.23 creat() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61 4.24 ctime() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63 4.25 difftime() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65 4.26 disable() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67 4.27 div() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69 4.28 ecvt() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70 4.29 enable() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72 4.30 exit() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74 INHALTSVERZEICHNIS 3 4.31 exp() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76 4.32 fabs() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78 4.33 fclose() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79 4.34 feof() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81 4.35 ferror() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83 4.36 fflush() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85 4.37 fgetc() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87 4.38 fgetpos() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89 4.39 fgets() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91 4.40 fileno() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93 4.41 floor() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94 4.42 flushall() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95 4.43 fmod() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96 4.44 fopen() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97 4.45 fprintf() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99 4.46 fputc() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100 4.47 fputs() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101 4.48 fread() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102 4.49 free() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104 4.50 freopen() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105 4.51 frexp() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106 4.52 fscanf() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107 4.53 fseek() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108 4.54 fsetpos() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110 4.55 ftell() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112 4.56 fwrite() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113 4.57 geninterrupt() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115 4.58 getc(), getchar() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 117 4.59 getcbrk() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 118 4.60 getch(), getche() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 119 4.61 getcurdir() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121 4 INHALTSVERZEICHNIS 4.62 getcwd() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123 4.63 getdate() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 125 4.64 getdfree() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 126 4.65 getdisk() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 128 4.66 getenv() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 129 4.67 gets() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 130 4.68 gettime() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 131 4.69 getvect() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132 4.70 gmtime() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 134 4.71 harderr() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 136 4.72 hardresume() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 140 4.73 hardretn() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143 4.74 inp(),outp() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 146 4.75 int86(),int86x() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 147 4.76 intdos() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 149 4.77 ioctl() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 151 4.78 isalnum() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 153 4.79 isalpha() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 154 4.80 isascii() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 155 4.81 isatty() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 156 4.82 iscntrl() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 157 4.83 isdigit() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 158 4.84 isgraph() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 159 4.85 islower() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 160 4.86 isprint() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 161 4.87 ispunct() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 162 4.88 isspace() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 163 4.89 isupper() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 164 4.90 isxdigit() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 165 4.91 itoa() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 166 4.92 kbhit() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 167 INHALTSVERZEICHNIS 5 4.93 labs() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 168 4.94 ldexp() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 169 4.95 ldiv() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 170 4.96 lfind() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 171 4.97 localtime() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 173 4.98 log() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 175 4.99 log10() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 177 4.100longjmp() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 178 4.101lseek() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 180 4.102malloc() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 182 4.103memchr() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 184 4.104memcmp() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 185 4.105memcpy() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 187 4.106memmove() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 188 4.107memset() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 189 4.108mktime() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 190 4.109modf() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 192 4.110open() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 194 4.111perror() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 196 4.112pow() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 197 4.113printf() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 198 4.114putc(),putchar() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 202 4.115puts() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 203 4.116qsort() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 204 4.117raise() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 206 4.118rand() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 208 4.119read() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 209 4.120realloc() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 211 4.121remove() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 213 4.122rename() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 215 4.123rewind() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 217 6 INHALTSVERZEICHNIS 4.124scanf() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 219 4.125setbuf() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 225 4.126setjmp() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 227 4.127setvbuf() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 229 4.128signal() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 231 4.129sin() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 234 4.130sinh() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 236 4.131spawn...() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 237 4.132sprintf() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 245 4.133sqrt() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 246 4.134srand() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 247 4.135sscanf() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 249 4.136stat() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 251 4.137strcat() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 254 4.138strchr() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 255 4.139strcmp() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 256 4.140strcpy() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 258 4.141strcspn() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 259 4.142strerror() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 261 4.143strlen() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 262 4.144strncat() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 263 4.145strncmp() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 264 4.146strncpy() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 266 4.147strpbrk() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 267 4.148strrchr() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 268 4.149strspn() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 269 4.150strstr() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 270 4.151strtod() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 271 4.152strtok() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 273 4.153strtol() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 275 4.154strtoul() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 277 INHALTSVERZEICHNIS 7 4.155system() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 279 4.156tan() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 280 4.157tanh() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 282 4.158time() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 283 4.159tmpfile() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 284 4.160tmpnam() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 285 4.161toascii() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 287 4.162tolower() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 288 4.163toupper() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 289 4.164ungetc() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 290 4.165ungetch() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 292 4.166unlink() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 294 4.167va arg() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 296 4.168vfprintf(), vprintf(), vsprintf() . . . . . . . . . . . . . . . . . . . . . . . . . 298 4.169write() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 303 8 INHALTSVERZEICHNIS Kapitel 1 Einleitung Der große Umfang der zur Verfügung stehenden C-Funktionen erfordert für den effizienten Einsatz bei der C-Programmierung eine übersichtliche Dokumentation. Diese Unterlage soll dem C-Programmierer als Hilfsmittel für die Programmierarbeit dienen, indem die wichtigsten C-Funktionen in ihrer Funktionalität beschrieben werden. Die Syntax der einzelnen Funktionen mit ihrer Aufrufsequenz bilden dabei den grundsätzlichen Rahmen der Beschreibung. Aus den zusätzlichen Erläuterungen kann der Anwender weitere wichtige Informationen zur Anwendung entnehmen. Die Hinweise dienen den anwendungsorientierten Problemstellungen und leisten einen Beitrag zum besseren Verständnis für den Einsatz der jeweiligen Funktion. Hierbei werden im wesentlichen die Leistungskriterien mit den Restriktionen und möglichen Fehlermeldungen beschrieben. Die Unterlage enthält alle wesentlichen Funktionen nach dem ANSI - Standard (sind bei der Funktionserklärung mit ANSI gekennzeichnet) mit zusätzlichen nützlichen Funktionen. Durch den Einsatz der ANSI - Funktionen ist eine gute Voraussetzung für die Portabilität der Programme gegeben und sollte immer berücksichtigt werden ! Zu jeder der aufgeführten Funktionen ist für die praktische Anwendung ein lauffähiges Beispiel angegeben, welches zum Testen auf dem IBM-PC (BORLAND C++ 3.1) direkt eingesetzt werden kann. Viele der vorliegenden Beispiele wurden auch unter UNIX erfolgreich getestet. Damit der C-Programmierer sich auf das Wesentliche konzentrieren kann, sind alle angegebenen Beispiele auf einer Diskette verfügbar. 10 KAPITEL 1. EINLEITUNG Kapitel 2 C-Präprozessor In vielen Programmen ist es sinnvoll, symbolische Namen für Konstanten zu verwenden. Unter Verwendung eines mnemotechnischen Namens ist oftmals eine bessere Programmentwicklung möglich. C bietet diese Möglichkeit in Form eines Makro-Präprozessors, der automatisch vor dem Kompilieren gestartet wird. Die Anweisungen für den Präprozessor werden durch das # in der 1. Spalte eingeleitet. Folgende Präprozessoranweisungen sind einsetzbar: • Einfügen von include - Dateien • Definition von symbolischen Konstanten • Definition von Makros • Bedingte Compilierung 2.1 #include-Direktive Durch die #include-Direktive wird die durch dateiname spezifizierte Datei in das Programm kopiert. Syntax Beispiel : #include “dateiname“ #include <dateiname> : #include “messwert“ #include <stdio.h> Das Einbinden der durch dateiname spezifizierten Datei erfolgt nach folgender Konvention: 12 KAPITEL 2. C-PRÄPROZESSOR Zeichen < ... > “. . .“ Bedeutung Die Datei wird nur in der Directory gesucht, welche durch die Umgebungsvariable INCLUDE festgelegt wurde. Die Datei wird zuerst im aktuellen Directory und nachfolgend in der durch INCLUDE festgelegten Directory gesucht. Enthält dateiname eine Pfadangabe, so wird nur im angegebenen Directory gesucht. Für die variable Programmierung kann der Dateiname auch als symbolische Konstante definiert werden. : Beispiel #include <stdio.h> #include “messwert.h“ #define VERSION “version1.h“ #include VERSION 2.2 Symbolische Konstanten Mit Hilfe von symbolischen Konstanten können variable und übersichtliche Programme entwickelt werden. Konstanten können am Programmanfang übersichtlich definiert und bei Bedarf leicht verändert werden. Syntax : Beispiele #define name Ersatztext : #define ANZ 1024 #define ESC \033 #define PI 3.14159265 Der Präprozessor ersetzt z.B. automatisch in dem nachfolgenden Programmtext ANZ durch 1024, wobei der Ersatztext eine Zeichenkette ist. Durch diesen Mechanismus können auch Funktionsnamen ersetzt werden. Die Fortsetzungszeile wird durch das Zeichen \ erzeugt. 2.3 Makro Eine Erweiterung zu der Vereinbarung von symbolischen Konstanten ist die Definition eines Makros. Syntax : #define makroname(para1, para2, . . . ) Ersatztext 2.4. BEDINGTE ÜBERSETZUNG Beispiele : #define MAX(x,y) ((x) > (y) ? (x):(y)) #define CLS printf(“\033 [2J“) 13 (DOS !!) Da Makros keine Funktionen sind, benötigen sie keinen Funktionsnamen und keine Rücksprungvereinbarung. Sie werden nur an den entsprechenden Stellen durch den Compiler ersetzt ! 2.4 Bedingte Übersetzung Für die Entwicklung von Programmen für unterschiedliche Systeme kann die Möglichkeit der bedingten Übersetzung eingesetzt werden. Mit Hilfe von Direktiven können Teile eines Programms durch Setzen von Steuerungsvariablen gezielt übersetzt werden. Hierfür stehen folgende Möglichkeiten zur Verfügung: Syntax : #if ausdruck #ifdef name #else #elif #endif #undef ausdruck2 14 KAPITEL 2. C-PRÄPROZESSOR #if ausdruck : wertet ausdruck aus. Ist der Wert wahr, also ein Wert verschieden von 0, so erfolgt die Bearbeitung des abhängigen Textes. #ifdef name stellt fest, ob name zuvor mit #define vereinbart wurde. Erfolgte eine Vereinbarung, wird der entsprechende Programmteil compiliert. #else kann bei der if - Bedingung als alternativer Pfad eingesetzt werden. Sie darf in einer #if - Bedingung höchstens einmal vorkommen. #elif kann in einer if - Bedingung als alternativer Pfad mehrmals eingesetzt werden. #endif schließt einen if - Block ab. #undef aud2 ausd2 wird zurückgesetzt. 2.4.1 Beispiel - Bedingte Übersetzung - \#define MCS main() { ....... ....... #ifdef MCS /* Testblock */ #endif } In diesem Beispiel wird der Block MCS übersetzt, da die Variable MCS mittels der define-Anweisung gesetzt (TRUE) wurde. Für die Programmierung ist zu beachten, daß eine Verschachtelung von if- Konstruktionen möglich ist, jedoch das # - Zeichen muß immer in der 1. Spalte gesetzt sein. 2.5. WICHTIGE INCLUDE-DATEIEN 2.5 15 Wichtige Include-Dateien Datei alloc.h malloc.h assert.h bios.h conio.h ctype.h dir.h dos.h ernno.h float.h graphics.h io.h limits.h locale.h math.h setjmp.h signal.h stdarg.h stddef.h stdio.h stdlib.h string.h sys\stat.h sys\types.h time.h Bedeutung Deklarationen für dynamische Speicherverwaltung. Deklarationen für dynamische Speicherverwaltung. Definiert das Makro assert für Prüfung eines Programms. Deklarationen für die Schnittstelle zu den BIOS-Funktionen. Deklarationen für die Schnittstelle von BIOS-Funktionen für Tastatur und Bildschirm. Definitionen von Makros für die Bearbeitung von Zeichen. Definitionen von Datentypen, Makros und Funktionen für Verzeichnisse und Path-Einstellungen. Definitionen von Datentypen, Makros und Deklaration. von Schnittstellen für den direkten Aufruf von DOS-Funktionen. Definitionen symbolischer Konstanten für Fehlernummern. Definition von Parametern für Gleitkomma-Funktionen. Prototypen für Grafikfunktionen. Strukturen und Deklarationen für einfache Ein-und Ausgabe. Definition von Parametern für die Umgebung, Grenzwerte des Compilers. Deklariert Funktionen, die länder- und sprachspezifische Informationen liefern. Deklaration mathematischer Funktionen. Deklaration der Funktionen setjmp,longjmp und definiert jmp buf für die Ausführung eines nicht lokalen goto. Deklariert die Funktionen signal, raise mit Konstanten. Definition der Funktionen mit variabler Parameterübergabe. Definition einer Anzahl allgemein verwendeter Datentypen und Makros. Deklaration für Standard Ein-/Ausgabefunktionen. Deklaration allgemeiner Routinen zur Konvertierung von Datentypen; Absuche und Sortieren von Arrays. Deklarationen für Funktionen zur Stringmanipulation. Definition von symbolischen Konstanten zum Öffnen und Arbeiten mit Dateien. Definition des Datentyps time t. Definition einer Struktur für Zeitumwandlungsroutinen. 16 KAPITEL 2. C-PRÄPROZESSOR Kapitel 3 Bibliotheksroutinen 17 18 3.1 3.1.1 KAPITEL 3. BIBLIOTHEKSROUTINEN Bibliotheksroutinen - Übersicht Klassifizierungsroutinen - ASCII-Zeichen Überprüfung einzelner ASCII-Zeichen auf z.B. Buchstabe, Steuerzeichen, Interpunktionszeichen, Großschreibung, . . . usw. Funktion - Beschreibung isalnum - Überprüfung alphanumerischer Zeichen. (ANSI) isalpha - Überprüfung alphanumerischer Zeichen. (ANSI) isascii - Überprüfung ASCII-Zeichen. (ANSI) iscntrl - Überprüfung Steuerzeichen. (ANSI) isdigit - Überprüfung Ziffer. (ANSI) isgraph - Überprüfung graphisches Zeichen. (ANSI) islower - Überprüfung Kleinbuchstabe. (ANSI) isprint - Überprüfung druckbares Zeichen. (ANSI) ispunct - Überprüfung Interpunktionszeichen. (ANSI) isspace - Überprüfung Zwischenraum. (ANSI) isupper - Überprüfung Großbuchstabe. (ANSI) isxdigit - Überprüfung Hexadezimal. (ANSI) 3.1. BIBLIOTHEKSROUTINEN - ÜBERSICHT 3.1.2 19 Konvertierungsroutinen Umwandlungsroutinen für Zeichen und Strings in numerische Werte und umgekehrt, sowie Umwandlung von Groß- in Kleinbuchstaben und umgekehrt. Funktion - Beschreibung atof - atoi - atol - ecvt itoa strtod strtol strtoul - toascii tolower toupper - ASCII TO Float - wandelt eine Zeichenkette in eine Gleitpunktzahl um. (ANSI) ASCII TO Integer - wandelt eine Zeichenkette in eine Integerzahl um. (ANSI) ASCII TO long - wandelt eine Zeichenkette in einen long-Wert. (ANSI) wandelt eine Gleitpunktzahl in eine Zeichenkette. (ANSI) konvertiert einen Integer-Wert in einen String. konvertiert einen String in einen double-Wert. (ANSI) konvertiert einen String in einen long-Wert.(ANSI) konvertiert einen String in einen unsigned long-Wert. (ANSI) Konvertierung von Zeichen in das ASCII-Format. wandelt Groß- in Kleinbuchstaben um. (ANSI) wandelt Klein- in Großbuchstaben um. (ANSI) 3.1.3 Verzeichnisroutinen Routinen für Verzeichnisse (Directory) und Suchwege (Path). Funktion - Beschreibung chdir getcurdir getcwd getdisk - wechselt das aktuell gesetzte Directory. ermittelt das aktuelle Verzeichnis eines Laufwerkes. ermittelt das aktuelle Arbeitsverzeichnis eines Laufwerkes. ermittelt das aktuelle Laufwerk. 3.1.4 Diagnoseroutinen Test auf Fehler und Behandlung von Laufzeitfehler. Funktion - Beschreibung assert perror matherr - überprüft den Ausdruck expression. (ANSI) gibt Systemfeldermeldung aus. (ANSI) programmierbare Routine zur Behandlung von Berechnungsfehlern. 20 3.1.5 KAPITEL 3. BIBLIOTHEKSROUTINEN I/O-Routinen Allgemeine Eingabe - und Ausgaberoutinen. Funktion - Beschreibung chmod clearerr close creat - fclose feof ferror fflush fgetc fgetpos fgets fileno flushall fopen fprintf feof fputc fputs fread freopen fscanf fseek fsetpos ftell fwrite getc, getchar getch, getche gets ioctl isatty kbhit lseek open perror printf putc,putchar puts - ändert die Zugriffsrechte einer Datei. (ANSI) setzt die Fehlerflags einer offenen Datei zurück. (ANSI) schließt eine Datei. erzeugt eine neue oder überschreitet eine bereits vorhandene Datei. (ANSI) schließt eine Datei. überprüft, ob das Ende der Datei erreicht wurde. (ANSI) Fehlerüberprüfung bei Zugriff auf Datei. (ANSI) Dateipuffer leeren. (ANSI) liest ein Zeichen aus Datei. (ANSI) ermittelt die aktuelle Position in der Datei. (ANSI) liest eine Zeichenkette aus einer Datei. (ANSI) ermittelt das File-Handle der Datei. Dateipuffer aller geöffneten Dateien leeren. eröffnet eine Datei. (ANSI) schreibt formatiert in eine Datei. (ANSI) überprüft, ob das Ende der Datei erreicht wurde. (ANSI) schreibt ein Zeichen in eine Datei. (ANSI) schreibt eine Zeichenkette in eine Datei. (ANSI) liest Daten aus einer Datei. (ANSI) wechselt die Datei. (ANSI) liest formatiert aus einer Datei. (ANSI) verschiebt den Dateizeiger in einer Datei. (ANSI) positioniert den Dateizeiger in einer Datei. (ANSI) ermittelt den aktuellen Dateizeiger. (ANSI) schreibt Daten in eine Datei. (ANSI) liest ein Zeichen aus der Datei. (ANSI) liest ein Zeichen von Tastatur. liest eine Zeichenkette von Tastatur. (ANSI) direkte Steuerung von Peripheriegeräten. Gerätetyp überprüfen. überprüft Tastatureingabe. verschiebt den Schreib-/Lesezeiger. öffnet eine Datei. gibt Systemfehlermeldung aus. (ANSI) gibt formatiert auf dem Bildschirm aus. (ANSI) gibt ein Zeichen aus. schreibt eine Zeichenkette auf Bildschirm. (ANSI) 3.1. BIBLIOTHEKSROUTINEN - ÜBERSICHT 21 Ein-Ausgabe-Routinen (Forts.). Funktion - Beschreibung read remove rename rewind scanf setbuf setvbuf sprintf sscanf stat strerror tmpfile tmpnam ungetc ungetch - vfprintf vsprintf write - liest Daten aus Datei. löscht eine Datei. (ANSI) ändert den Namen einer Datei von oldname auf newname. (ANSI) setzt den Dateizeiger auf den Anfang der Datei. (ANSI) liest formatierte Daten ein. (ANSI) explizite Pufferzuordnung. (ANSI) explizite variable Pufferzuordnung. (ANSI) formatierte Ausgabe in einen String. (ANSI) liest eine formatierte Eingabe. (ANSI) ermittelt Status-Informationen einer Datei. (ANSI) liefert einen Zeiger auf einen String mit Fehlermeldung. (ANSI) eröffnet eine temporäre Datei im Binär-Modus. (ANSI) erzeugt eindeutige Namen für temporäre Dateien. (ANSI) schreibt ein gelesenes Zeichen in eine Datei zurück. (ANSI) stellt ein gelesenes Zeichen von der Tastatur in den Tasturpuffer zurück. formatierte Ausgabe mit Zeiger auf Argumentliste. (ANSI) formatierte Ausgabe in einen String. (ANSI) schreibt Daten in eine Datei. (ANSI) 3.1.6 DOS/8086/BIOS-Routinen Routinen für den direkten Zugriff von DOS-,BIOS-, und hardware-spezifischen Funktionen. Funktion - Beschreibung disable enable geninterrupt getcbrk getdfree getvect harderr hardresume hardretn int86, int86x intdos unlink - unterdrückt Hardware-Interrupts. aktiviert Hardware-Interrupts. erzeugt einen Software-Interrupt. ermittelt Ctrl-Break-Flag. ermittelt den freien Platz auf einer Diskette/Festplatte. liest einen Interrupt-Vektor. installiert einen Hardware-Error-Handler. Hardware-Fehlerbehandlungsroutine. Hardware-Fehlerbehandlungsroutine. Genereller 8086-Softwareinterrupt. allgemeiner DOS-Funktionsaufruf. löscht eine Datei. 22 3.1.7 KAPITEL 3. BIBLIOTHEKSROUTINEN String- und Speichermanipulation Stringverarbeitung - Vergleichen, Kopieren, Verschieben, Suchen. Funktion - Beschreibung memchr memcmp memcpy memmove memset strcat strchr strcmp strcpy strcspn - strerror - strlen strncat - strncmp - strncpy strpbrk - strrchr - strstr strtok - sucht Zeichen im String. (ANSI) vergleicht n Bytes zweier Arrays. (ANSI) kopiert n Bytes aus Quell-Puffer in Ziel-Puffer. (ANSI) kopiert einen Block von n Bytes. (ANSI) setzen von n Bytes des Arrays mit konstantem Wert. (ANSI) hängt einen String an einen anderen. (ANSI) sucht ein Zeichen im String. (ANSI) vergleicht zwei Strings miteinander. (ANSI) kopiert einen String in einen anderen. (ANSI) liefert die Länge des Teilstrings von s1, der keines der Zeichen von String s2 enthält. (ANSI) liefert einen Zeiger auf einen String mit Fehlermeldungen. (ANSI) ermittelt die Länge eines Strings. (ANSI) hängt einen String bestimmter Länge an einen anderen. (ANSI) vergleicht eine bestimmte Länge von zwei Strings miteinander. (ANSI) kopiert einen String bestimmter Länge in einen anderen. (ANSI) sucht in einem String nach dem Vorkommen bestimmter Zeichen. (ANSI) sucht in einem String nach dem letzten Vorkommen eines Zeichen. (ANSI) sucht im String s1 nach einem Teilstring. (ANSI) Sucht einen String nach einer von mechreren Zeichenfolgen ab, die in einem zweiten String definiert sind. (ANSI) 3.1. BIBLIOTHEKSROUTINEN - ÜBERSICHT 3.1.8 Mathematische Routinen Funktion - Beschreibung abs acos asin atan atan2 atof - atoi - atol - ceil - cos cosh div - ecvt exp fabs floor - fmod itoa labs ldexp ldiv log log10 modf - pow rand sin sinh sqrt srand strtod strtol strtoul tan - berechnet den Absolutwert eines int-Wertes. (ANSI) berechnet den Arcus Cosinus des Argumentes c. (ANSI) berechnet den Arcus Sinus des Argumentes x. (ANSI) berechnet den Arcus Tangens des Argumentes x. (ANSI) berechnet den Arcus Tangens des Argumentes y/x. (ANSI) Ascii TO Float- wandelt eine Zeichenkette in eine Gleitpunktzahl um. (ANSI) Ascii TO Integer - wandelt eine Zeichenkette in eine Integerzahl um. (ANSI) Ascii TO long - wandelt eine Zeichenkette in einen long-Wert. (ANSI) berechnet die kleinste ganze Zahl, die größer oder gleich dem Wert von x ist. (ANSI) berechnet den Cosinus des Argumentes x. (ANSI) berechnet den Cosinus Hyperbolicus des Argumentes x. (ANSI) dividiert zwei Integerwerte und liefert den Quotienten sowie den Rest über eine Struktur zurück. (ANSI) wandelt eine Gleitpunktzahl in eine Zeichenkette um. (ANSI) berechnet ex . (ANSI) berechnet den Absolutwert einer Gleitpunktzahl. (ANSI) berechnet die größte ganze Zahl, die kleiner oder gleich x ist. (ANSI) berechnet x modulo y. (ANSI) konvertiert einen Integer-Wert in einen String. (ANSI) berechnet den Absolutwert eines long- Wertes. (ANSI) berechnet x ∗ 2exp . (ANSI) führt eine long-Division durch. (ANSI) berechnet den natürlichen Logarithmus. (ANSI) berechnet den natürlichen Logarithmus Basis 10. (ANSI) zerlegt x in einem gebrochenen und einen ganzzahligen Anteil. (ANSI) berechnet die Potenz xy . (ANSI) liefert eine Zufallszahl. (ANSI) berechnet den Sinus des Argumentes x. (ANSI) berechnet den Sinus Hyperbolicus des Argumentes x. (ANSI) berechnet die Quadratwurzel des Argumentes x. (ANSI) initialisiert Zufallsgenerator. (ANSI) konvertiert einen String in einen double-Wert. (ANSI) konvertiert einen String in einen long-Wert. (ANSI) konvertiert einen String in einen unsigned long-Wert. (ANSI) berechnet den Tangens des Argumentes x. (ANSI) 23 24 3.1.9 KAPITEL 3. BIBLIOTHEKSROUTINEN Dynamische Verwaltung des Speichers Routinen zur dynamischen Verwaltung des Speichers. Funktion - Beschreibung free calloc malloc realloc - gibt einen dynamisch belegten Speicherbereich frei. (ANSI) reserviert Speicherplatz für n-Elemente. (ANSI) reserviert Speicherplatz. (ANSI) ändert die Größe des dynamischen Speicherblocks. (ANSI) 3.1.10 Diverses Hilfreiche Routinen. Funktion - Beschreibung longjmp setjmp - führt ein nicht lokales goto aus. (ANSI) bereitet ein nicht lokales goto vor. (ANSI) 3.1.11 Prozeßroutinen Routinen zur Prozeßverarbeitung. Funktion - Beschreibung abort exit raise signal - bricht einen Prozeß ab. (ANSI) beendet das laufende Programm. (ANSI) sendet Softwaresignale. (ANSI) Signalverarbeitung. (ANSI) 3.1. BIBLIOTHEKSROUTINEN - ÜBERSICHT 3.1.12 Standardroutinen Allgemeine Standardroutinen. Funktion - Beschreibung abort abs atexit - atof - atoi - atol - bsearch calloc ecvt exit free itoa labs lfind malloc qsort - rand realloc srand strtod strtol strtoul system - bricht einen Prozeß ab. (ANSI) berechnet den Absolutwert eines int-Wertes. (ANSI) legt Routinen fest, die am Ende eines Programmms ausgeführt werden sollen. (ANSI) Ascii TO Float- wandelt eine Zeichenkette in eine Gleitpunktzahl um. (ANSI) Ascii TO Integer - wandelt eine Zeichenkette in eine Integer um. (ANSI) Ascii TO long - wandelt eine Zeichenkette in einen long-Wert. (ANSI) Binäres Suchen in einer Liste. (ANSI) reserviert Platz im Hauptspeicher. (ANSI) wandelt eine Gleitpunktzahl in eine Zeichenkette um. (ANSI) beendet das laufende Programm. (ANSI) gibt einen dynamisch belegten Speicherbereich frei. (ANSI) konvertiert einen Integer-Wert in einen String. (ANSI) berechnet den Absolutwert eines long- Wertes. (ANSI) lineare Suche im Array. (ANSI) reserviert Speicherplatz. (ANSI) sortiert n-Elemente in auf- und absteigender Reihenfolge. (ANSI) liefert eine Zufallszahl. (ANSI) ändert die Größe des dynamischen Speicherblocks. (ANSI) initialisiert Zufallsgenerator. (ANSI) konvertiert einen String in einen double-Wert. konvertiert einen String in einen long-Wert. konvertiert einen String in einen unsigned long-Wert. Ausführung eines DOS-Befehls. (ANSI) 25 26 3.1.13 KAPITEL 3. BIBLIOTHEKSROUTINEN Datum und Uhrzeit Routinen zum Setzen, Lesen, Konvertieren von Datum / Uhrzeit des Systems. Funktion - Beschreibung asctime ctime difftime - getdate gettime gmtime - mktime time - konvertiert Datum und Uhrzeit in einen String. (ANSI) konvertiert Datum und Uhrzeit in einen String. (ANSI) berechnet den Unterschied zwischen zwei Zeitangaben in Sekunden. (ANSI) ermittelt das aktuelle Datum. (ANSI) ermittelt die Uhrzeit des Systems. (ANSI) rechnet Datum und Uhrzeit in die Greenwich Mean Time (GMT) um. (ANSI) konvertiert die Uhrzeit in das Kalenderformat. (ANSI) liefert Datum und Uhrzeit des Systems. (ANSI) 3.1.14 Variable Argumente Routinen zur variablen Parameterliste. Funktion - Beschreibung va arg va end va start - Makro für Funktionen mit variabler Parameterzahl. (ANSI) Makro für Funktionen mit variabler Parameterzahl. (ANSI) Makro für Funktionen mit variabler Parameterzahl. (ANSI) Kapitel 4 Funktionen 28 KAPITEL 4. FUNKTIONEN 4.1 abort() Name : abort — bricht einen Prozeß ab. Benutzung : void abort(void); Prototyp in : <stdlib.h> , <process.h> Beschreibung : abort() gibt die Meldung: (ANSI) • Abnormal program termination an stderr ab und bricht den laufenden Prozeß ab. An den aufrufenden Prozeß wird der Exit-Code 3 übergeben. Die Funktion exit() bewirkt im Unterschied zu abort() eine normale Programmbeendigung. Return-Wert: : keiner Querverweis : assert exit raise spawn atexit exit signal UNIX Solaris 2.x : wie oben SunOS 4.1.x : int abort(void) : Beispiel zur Funktion abort() #include <stdlib.h> #include <stdio.h> int main(void) { printf("’abort() wird aufgerufen\n"’); abort(); return 0; /* wird niemals erreicht */ } 4.2. ABS() 4.2 29 abs() Name : abs — berechnet den Absolutwert eines int-Wertes. #include Benutzung : : <stdlib.h> oder <math.h> int abs(int x); Prototyp in : <stdlib.h> oder <math.h> (ANSI) Beschreibung : abs() absolute value berechnet den Absolutwert eines intWertes. Für die Berechnung des Absolutwertes einer Zahl vom Typ long oder double kann die Funktion labs() bzw. fabs() verwendet werden. Return-Wert: : Der Absolutwert von x, d.h. • x, f alls x ≥ 0, • −x, f alls x < 0 Querverweis : Beispiel : int x = -2; printf(“%d\n“’,abs(x)); Ergebnis : 2 UNIX : Solaris 2.x / SunOS 4.1.x : wie oben Beispiel zur Funktion abs() #include <stdio.h> #include <math.h> int main(void) { int zahl = -1234; printf("Der absolute Betrag von %d ist %d\n",zahl, abs(zahl)); return 0; } 30 4.3 KAPITEL 4. FUNKTIONEN acos() Name : acos — berechnet den Arcus Cosinus des Argumentes x. (ANSI) Benutzung : double acos(double x); complex acos(complex x); Prototyp in : <math.h> (reel) <complex.h> (complex) Beschreibung : acos() arcosine berechnet den Arcus Cosinus des Argumentes x. Der Wert von x muß zwischen -1 und +1 (einschließlich) liegen. Die Funktion ist die Umkehrfunktion von cos(). Return-Wert: : Die Funktion gibt den Arcus Cosinus von x im Bogenmaß zurück. Der Wert liegt im Bereich von 0 und pi = 3.1415927..... Im Fehlerfall, wenn x > 1 oder x < −1 ist, wird der Wert 0 zurückgegeben. Es wird eine Fehlermeldung auf stderr ausgegeben, und die Fehler- variable errno erhält den Wert EDOM (= domain error). Fehlerbehandlung kann ev. unter Verwendung der Funktion matherr geändert werden. Querverweis : asin atan2 cos sin atan complex matherr tan Beispiel : printf(“acos(-1.0) = %6.4f\n“,acos(-1.0)); printf(“acos(0.0) = %6.4f\n“,acos(0.0)); printf(“acos(1.0) = %6.4f\n“,acos(1.0)); Ergebnis : acos(-1.0) = 3.1416 acos(0.0) = 1.5708 acos(1.0) = 0.0000 UNIX : Solaris 2.x : Headerdatei <complex.h> nicht vorhanden; sonst wie oben SunOS 4.1.x : Headerdatei <complex.h> nicht vorhanden; sonst wie oben 4.3. ACOS() Beispiel zur Funktion acos() #include <stdio.h> #include <math.h> int main(void) { double result; double x = 0.5; result = acos(x); printf("Der Arcuscosinus von %lf ist %lf\n",x,result); return 0; } 31 32 4.4 KAPITEL 4. FUNKTIONEN asctime() Name : asctime — konvertiert Datum und Uhrzeit in einen String. (ANSI) Benutzung : char *asctime(struct tm *systime); Prototyp in : <time.h> Beschreibung : asctime() (ASCII time) konvertiert Datum und Uhrzeit in einen String. Datum und Zeit sind in der durch systime adressierten Struktur vom Typ tm abgelegt. Diese Struktur wurde zuvor durch einen Aufruf der Funktion localtime() oder gmtime() angelegt und mit Werten gefüllt. Der in time.h definierte Strukturtyp tm wird bei der Funktion mktime() beschrieben. Return-Wert: : Die Funktion liefert einen Zeiger auf einen String mit Datum und Uhrzeit zurück. Der String ist 26 Bytes lang. Das genaue Format ist bei der Funktion ctime() beschrieben. Querverweis : ctime gmtime stime time difftime localtime strftime tzset Beispiel struct tm systime; time t sec; : time(&sec); systime = localtime(&sec); printf(“Datum und Uhrzeit: %s\n“,asctime(systime)); Ergebnis : Datum und Uhrzeit : Thu Oct 15 08:32:16 1991 UNIX : Solaris 2.x / SunOS 4.1.x : wie oben 4.4. ASCTIME() 33 Beispiel zur Funktion asctime() #include <stdio.h> #include <string.h> #include <time.h> int main(void) { struct tm t; char str[80]; /* Beispiel fuer die Initialisierung einer tm-Struktur */ t.tm_sec t.tm_min t.tm_hour t.tm_mday t.tm_mon t.tm_year = = = = = = 1; 30; 9; 22; 11; 56; t.tm_wday t.tm_yday = 4; = 0; t.tm_isdst = 0; /* /* /* /* /* /* Sekunden */ Minuten */ Stunde */ Tag des Monats */ Monat */ Jahr ohne Jahrhundert */ /* Tag der Woche */ /* wird von asctime nicht angezeigt */ /* "Daylight SavTime" Sommerzeit; wird von asctime nicht angezeigt */ /* konvertiert die Struktur in einen nullterminierten String */ strcpy(str, asctime(&t)); printf("%s\n", str); return 0; } 34 4.5 KAPITEL 4. FUNKTIONEN asin() Name : asin — berechnet den Arcus Sinus des Argumentes x. Benutzung : double asin(double x); complex asin(complex x); Prototyp in : <math.h> (reel) <complex.h> (complex) (ANSI) Beschreibung : asin() (arcsine) berechnet den Arcus Sinus des Argumentes x. Der Wert von x muß zwischen -1 und +1 (einschließlich) liegen. Die Funktion ist die Umkehrfunktion von sin(). Return-Wert: : Die Funktion gibt den Arcus Sinus von x im Bogenmaß zurück. Der Wert liegt im Bereich von -pi/2 und pi/2 (pi = 3.1415927....). Im Fehlerfall, wenn x > 1 oder x < −1 ist, wird der Wert 0 zurückgegeben. Es wird eine Fehlermeldung auf stderr ausgegeben, und die Fehler- variable errno erhält den Wert EDOM (= domain error). Fehlerbehandlung kann ev. unter Verwendung der Funktion matherr geändert werden. Querverweis : acos atan2 cos sin atan complex matherr tan Beispiel : printf(“asin(-1.0) = %6.4f\n“,asin(-1.0)); printf(“asin(0.0) = %6.4f\n“,asin(0.0)); printf(“asin(1.0) = %6.4f\n“,asin(1.0)); Ergebnis : asin(-1.0) = -1.5708 asin(0.0) = 0.0000 asin(1.0) = 1.5708 UNIX : Solaris 2.x : Headerdatei <complex.h> nicht vorhanden; sonst wie oben SunOS 4.1.x : Headerdatei <complex.h> nicht vorhanden; sonst wie oben 4.5. ASIN() Beispiel zur Funktion asin() #include <stdio.h> #include <math.h> int main(void) { double result; double x = 0.5; result = asin(x); printf("Der Arcussinus von %lf ist %lf\n", x, result); return(0); } 35 36 4.6 KAPITEL 4. FUNKTIONEN assert() Name : assert — überprüft den Ausdruck expression. Benutzung : void assert(int expression); Prototyp in : <assert.h> Beschreibung : (ANSI) Das Makro assert() (assertion) überprüft den Ausdruck expression. Ist das Ergebnis 0 (= falsch), wird die Meldung • Assertion failed: expression, file: name , line: number ausgegeben. Danach erfolgt ein Abbruch des Programms. Es ist name der Name des Programms und line die Zeilennummer, in der assert() aufgerufen wurde. Ist der Ausdruck expression ein von 0 verschiedener Wert (= wahr), erfolgt keine Aktion. Das Makro kann zum Auffinden von logischen Fehlern in einem Programm eingesetzt werden. Nach dem Entfernen aller Fehler aus dem Programm, kann die Konstante NDEBUG mit einem beliebigen Wert belegt werden, damit der Präprozessor alle Aufrufe von assert() aus dem Quellcode entfernt. Return-Wert: : keiner Querverweis : abort Beispiel : double x = -1.0, y, z; y = sin(x) - cos(x); assert(y > 0); z = log(y); /* log(y) nur für positive y definiert */ Ergebnis : Ausgabe in diesem Beispiel: Assertion faild: y > 0, file: C: assert.c, line: 10 UNIX : Solaris 2.x / SunOS 4.1.x : wie oben 4.6. ASSERT() Beispiel zur Funktion assert() #include <assert.h> #include <stdio.h> #include <stdlib.h> struct ITEM { int key; int value; }; /* Eintrag in Liste, damit Liste nicht leer ist */ void additem(struct ITEM *itemptr) { assert(itemptr != NULL); /* Eintrag in Liste einfuegen */ } int main(void) { additem(NULL); return 0; } 37 38 4.7 KAPITEL 4. FUNKTIONEN atan() Name : atan — berechnet den Arcus Tangens des Argumentes x. (ANSI) Benutzung : double atan(double x); complex atan(complex x); Prototyp in : <math.h> (reel) <complex.h> (complex) Beschreibung : atan() (arc tangent) berechnet den Arcus Tangens des Argumentes x. Die Funktion ist die Umkehrfunktion der Funktion tan(). Return-Wert: : Die Funktion gibt den Arcus Tangens von x im Bogenmaß zurück. Der Wert liegt im Bereich von -pi/2 und pi/2 (pi = 3.1415927....). Querverweis : acos atan2 cos sin asin tanh cosh sinh atan complex matherr tan Beispiel : printf(“atan(-1.0) = %7.4f\n“,atan(-1.0)); printf(“atan(0.0) = %7.4f\n“,atan(0.0)); printf(“atan(1.0) = %7.4f\n“,atan(1.0)); Ergebnis : atan(-1.0) = -0.7854 atan(0.0) = 0.0000 atan(1.0) = 0.7854 Hinweis: 0.7854 0 = pi/4. UNIX : Solaris 2.x : Headerdatei <complex.h> nicht vorhanden; sonst wie oben SunOS 4.1.x : Headerdatei <complex.h> nicht vorhanden; sonst wie oben 4.7. ATAN() Beispiel zur Funktion atan() #include <stdio.h> #include <math.h> int main(void) { double result; double x = 0.5; result = atan(x); printf("Der Arcustangens von %lf ist %lf\n",x,result); return(0); } 39 40 4.8 KAPITEL 4. FUNKTIONEN atan2() Name : atan2 — berechnet den Arcus Tangens von y/x. Benutzung : double atan2(double y, double x); Prototyp in : <math.h> (reel) (ANSI) Beschreibung : atan2() (arc tangent 2) berechnet den Arcus Tangens des Argumentes x. Return-Wert: : Die Funktion gibt den Arcus Tangens von x im Bogenmaß zurück. Der Wert liegt im Bereich von -pi/2 und pi/2 (pi = 3.1415927....). Der Quadrant für den Return-Wert wird durch die Vorzeichen beider festgelegt. Sind beide Argumente 0, so erhält die Fehlervariable errno den Wert EDOM (domain error) und eine entsprechende Fehlermeldung wird auf stderr ausgegeben. Der Return-Wert ist in diesem Fall 0. Querverweis : acos atan cos sin asin matherr Beispiel : double x = 3; y = 3; /* y/x =1 */ printf(“atan2(y,x) = %10f\n“,atan2(y,x)); printf(“atan2(-y,x) = %10f\n“,atan2(-y,x)); printf(“atan2(y,-x) = %10f\n“,atan2(y,-x)); printf(“atan2(-y,x) = %10f\n“,atan2(-y,x)); Ergebnis : atan2(y,x) = 0.785398 atan2(-y,x) = -0.785398 atan2(y,-x) = 2.356194 atan2(-y,x) = -2.356194 Hinweis: 0.785398 = pi/4. UNIX : 2.356194 = 3/4*pi Solaris 2.x : Headerdatei <complex.h> nicht vorhanden; sonst wie oben SunOS 4.1.x : Headerdatei <complex.h> nicht vorhanden; sonst wie oben 4.8. ATAN2() Beispiel zur Funktion atan2() #include <stdio.h> #include <math.h> int main(void) { double result; double x = 90.0, y = 45.0; result = atan2(y, x); printf("Der Arcustangens von %lf " "ist %lf\n", (y / x), result); return 0; } 41 42 4.9 KAPITEL 4. FUNKTIONEN atexit() Name : atexit — legt Routinen fest, die am Ende eines Programms ausgeführt werden sollen. (ANSI) Benutzung : int atexit(void(*func)(void)); Prototyp in : <stdlib.h> (reel) Beschreibung : der Funktion atexit() (at exit) wird ein Zeiger func auf eine Funktion vom Typ void übergeben, die am Ende des Programms aufgerufen werden sollen. Jeder Aufruf von atexit() registriert einen Zeiger auf eine Funktion, die nach dem last in, first out- Prinzip verwaltet wird. Die Funktion des letzen Aufrufs von atexit() wird als erstes bearbeitet (max. 32 Aufrufe). Return-Wert: : Die Funktion gibt im Fehlerfall einen Wert ungleich 0, sonst den Wert 0 aus. Querverweis : acos atan cos sin asin matherr UNIX Solaris 2.x : wie oben SunOS 4.1.x : steht nicht zur Verfügung : Beispiel(1) zur Funktion atexit() #include <stdio.h> #include <stdlib.h> void exit_fn1(void) { printf("Exit-Funktion #1 aufgerufen\n"); } void exit_fn2(void) { printf("Exit-Funktion #2 aufgerufen\n"); } int main(void) { /* Exit-Funktion #1 eintragen */ 4.9. ATEXIT() 43 atexit(exit_fn1); /* Exit-Funktion #2 eintragen */ atexit(exit_fn2); return 0; /* Exit-Funktionen werden nach return aufgerufen */ } Beispiel(2) zur Funktion atexit() #include <stdlib.h> int atexit(void(*func)(void)); void main(void) { void func1(void), func2(void); atexit(func1); atexit(func2); printf("\n Ende des Programms\n"); } void func1(void) { printf("Funktion func1() wurde ausgefuehrt. \n"); } void func2(void) { printf("Funktion func2() wurde ausgefuehrt. \n"); } /* Ergebnis : */ Ende des Programms. Funktion func2() wurde ausgefuehrt Funktion func1() wurde ausgefuehrt 44 4.10 KAPITEL 4. FUNKTIONEN atof() Name : atof — Ascii TO Float - wandelt eine Zeichenkette in eine Gleitpunktzahl um. (ANSI) Benutzung : double atof (const char *str); Prototyp in : <stdlib.h> , <math.h> Beschreibung : atof wandelt eine Zahl, die als ASCII- Zeichenkette gespeichert ist, in einen double-Wert um und meldet diesen als Funktionswert zurück. Führende Zwischenraumzeichen (Leer-, Tabulator-, Newline-Zeichen) von str werden überlesen. Führende Vorzeichen werden verarbeitet. Die Umwandlung wird beim ersten N icht − Zif f er − Zeichen beendet (Ausnahme: das Zeichen .). Die Funktion strod() bewirkt dieselbe Umwandlung und liefert außerdem einen Zeiger auf das Zeichen, bei dem die Umwandlung abgebrochen wurde. Zur Umwandlung in eine Zahl vom Typ int oder long kann die Funktion atoi() bzw. atol() verwendet werden. Return-Wert: : Die Funktion gibt einen double-Wert der korrespondierenden Zeichenkette zurück. Funktionswert ist 0, wenn Konvertierung nicht fehlerfrei ausgeführt werden konnte. Falls ein Überlauf erzeugt wurde, ist der Return-Wert undefiniert. Querverweis : atoi ecvt gcvt strod atol fcvt scanf Beispiel : char str[10] = “ 12.67h78“; printf(“%f\n“,atof(str)); Ergebnis : 12.670000 UNIX : Solaris 2.x : wie oben (Exponentialschreibweise erlaubt) SunOS 4.1.x : wie oben (Exponentialschreibweise erlaubt) • In manchen UNIX-Versionen ist die Angabe von Exponenten (gekennzeichnet mit e oder E) erlaubt. • Diese Funktion ist in LATTICE-C unter MS-DOS nicht verfügbar. 4.10. ATOF() Beispiel zur Funktion atof() #include <stdlib.h> #include <stdio.h> int main(void) { float f; char *str = "12345.67"’; f = atof(str); printf("String = %s \nfloat = %f\n", str, f); return 0; } 45 46 4.11 KAPITEL 4. FUNKTIONEN atoi() Name : atoi — ASCII to Integer - wandelt eine Zeichenkette in eine Integer um. (ANSI) Benutzung : int atoi (const char *str); Prototyp in : <stdlib.h> Beschreibung : atoi() (alphanumeric to int) wandelt eine Zahl, die als ASCII- Zeichenkette gespeichert ist, in einen int-Wert um und meldet diesen als Funktionswert zurück. Führende Zwischenraumzeichen (Leer-, Tabulator-, Newline-Zeichen) von str werden überlesen. Ein Dezimalpunkt oder Exponent wird nicht als Teil einer Zahl angesehen. Führende Vorzeichen werden verarbeitet. Die Umwandlung wird beim ersten N icht − Zif f er − Zeichen beendet. Zur Umwandlung in eine Zahl vom Typ int oder long kann die Funktion atoi() bzw. atol() verwendet werden. Return-Wert : Die Funktion gibt einen int-Wert der korrespondierenden Zeichenkette zurück. Funktionswert ist 0, wenn Konvertierung nicht fehlerfrei ausgeführt werden konnte. Falls die zu wandelnde Zahl zu groß für den Typ int wird, ist der Return-Wert undefiniert. Querverweis : atof ecvt gcvt strod atol fcvt scanf Beispiel : char *str = “ +125 Wert“; printf(“atoi(str) = %d\n“,atoi(str)); Ergebnis : atoi(str) = 125 UNIX : Solaris 2.x / SunOS 4.1.x : wie oben 4.11. ATOI() Beispiel zur Funktion atoi() #include <stdlib.h> #include <stdio.h> int main(void) { int n; char *str = "12345.678"; n = atoi(str); printf("String = %s \nInteger = %d\n", str, n); return 0; } 47 48 4.12 KAPITEL 4. FUNKTIONEN atol() Name : atol — ASCII TO long - wandelt eine Zeichenkette in einen longWert. (ANSI) Benutzung : long atol (const char *str); Prototyp in : <stdlib.h> Beschreibung : atol() (alphanumeric to long) wandelt eine Ganzzahl, die als ASCII- Zeichenkette gespeichert ist, in einem long-Wert um und meldet diesen als Funktionswert zurück. Führende Zwischenraumzeichen (Leer-, Tabulator-, Newline-Zeichen) von str werden überlesen. Ein Dezimalpunkt oder Exponent wird nicht als Teil einer Zahl angesehen. Führende Vorzeichen werden verarbeitet. Die Umwandlung wird beim ersten N icht − Zif f er − Zeichen beendet. Die Funktion strol() bewirkt dieselbe Umwandlung und liefert außerdem einen Zeiger auf das Zeichen, bei dem die Umwandlung abgebrochen wurde. Zur Umwandlung in eine Zahl vom Typ int oder double kann die Funktion atoi() bzw. atof() verwendet werden. Return-Wert : Die Funktion gibt einen long-Wert der korrespondierenden Zeichenkette zurück. Funktionswert ist 0, wenn Konvertierung nicht fehlerfrei ausgeführt werden konnte. Querverweis : atof fcvt strtod atoi gcvt strtol ecvt scanf strtoul Beispiel : char *str = “ -12345678.- Wert“; printf(“atol(str) = %ld\n“,atol(str)); Ergebnis : atol(str) = -12345678 UNIX : Solaris 2.x / SunOS 4.1.x : wie oben 4.12. ATOL() Beispiel zur Funktion atol() #include <stdlib.h> #include <stdio.h> int main(void) { long l; char *str = "98765432"; l = atol(str); printf("String = %s \n" "Long-Integer = %ld\n", str, l); return(0); } 49 50 4.13 KAPITEL 4. FUNKTIONEN bsearch() Name : bsearch — Binäres Suchen in einer Liste. (ANSI) Benutzung : void ∗bsearch(const void ∗key, const void ∗array, size t n, size t size, int(∗compare)()); Prototyp in : <stdlib.h> Beschreibung : bsearch() (binary search) sucht in einem sortierten Vektor einen durch key spezifizierten Wert. Der Vektor enthält n- Vektorelemente der Größe size. Der Datentyp size t ist in stdlib.h als unsigned int definiert. Das Argument compare ist ein Zeiger auf eine Funktion, die den gesuchten Wert mit dem Vektorelement vergleicht. Die Definition einer solchen Funktion wird bei der Funktion qsort() beschrieben. Return-Wert : Die Funktion gibt die Adresse des ersten Vektorelementes zurück, das mit dem gesuchten Wert (key) übereinstimmt. Ist ein solches Vektorelement nicht vorhanden, wird ein NULL- Zeiger zurückgeliefert. besearch() interpretiert den Rückgabewert der benutzerdefinierten Vergleichsfunktion ∗compare() wie folgt: Wert <0 == 0 >0 Bedeutung ∗elem1 < ∗elem2 ∗elem1 == ∗elem2 ∗elem1 > ∗elem2 Querverweis : lfind lsearch qsort Beispiel int scmp(char **s1, char **s2); static char *farben[]={“rot“,“blau“,“gelb“}; static char key[]= “pink“; : if (bsearch(key,farben,5,sizeof( char *),scmp) == NULL) printf(“Farbe %s nicht gefunden\n“,key); .... int scmp (char **s1, char **s2) { return strcmp(*s1, *s2); } 4.13. BSEARCH() UNIX : Solaris 2.x / SunOS 4.1.x : wie oben Beispiel zur Funktion bsearch() #include #include <stdlib.h> <stdio.h> #define NELEMS(arr) (sizeof(arr) / sizeof(arr[0])) typedef int (*fcmp)(const void *, const void *); int int int numeric (int *, int *); lookup(int); numarray[] = {123, 145, 512,}; int main(void) { if (lookup(512)) printf("512 ist in der Tabelle enthalten.\n"); else printf("512 befindet sich nicht in der Tabelle.\n"); return 0; } int numeric (int *p1, int *p2) { return(*p1 - *p2); } int lookup(int key) { int *itemptr; itemptr = (int *) bsearch (&key, numarray, NELEMS(numarray), sizeof(int), (fcmp) numeric); return (itemptr != NULL); } 51 52 4.14 KAPITEL 4. FUNKTIONEN calloc() Name : calloc — reserviert Platz im Hauptspeicher. Benutzung : void *calloc (size t n, size t size); Prototyp in : <stdlib.h> (ANSI) Beschreibung : calloc() (core allocation) reserviert Platz im Hauptspeicher für einen Block von n*size-Bytes und initialisiert diesen im Gegensatz zur Funktion malloc() mit 0. Return-Wert: : Die Funktion gibt einen Zeiger auf die Anfangsadresse des zugeteilten Speicherbereiches zurück. Wenn nicht genügend Speicherplatz vorhanden ist oder n oder size den Wert 0 hat, liefert die Funktion den NULL-Zeiger. Querverweis : farcalloc free malloc realloc Beispiel size t n; int *p; : printf(“Wieviel Ganzzahlen wollen Sie eingeben \n“); scanf(“%u “,&n); p = (int *) calloc(n, sizeof(int)); if (p == NULL) printf(“Nicht genügend Speicherplatz vorhanden \n“); else Eingabe der Zahlen in den reservierten Bereich UNIX : Solaris 2.x / SunOS 4.1.x : wie oben 4.14. CALLOC() Beispiel zur Funktion calloc() #include <stdio.h> #include <alloc.h> int main(void) { char *str = NULL; /* Speicher fuer den String reservieren */ str = calloc(10, sizeof(char)); /* "Hallo" in den String kopieren */ strcpy(str, "Hallo"); /* String anzeigen */ printf("Das ist der String: %s\n", str); /* Den vom String belegten Speicher freigeben */ free(str); return 0; } 53 54 4.15 KAPITEL 4. FUNKTIONEN ceil() Name : ceil — berechnet die kleinste ganze Zahl, die größer oder gleich x ist. (ANSI) Benutzung : double ceil(double x); Prototyp in : <math.h> Beschreibung : ceil() (ceiling=Decke) berechnet die kleinste ganze Zahl, die größer oder gleich x ist. Die Gegenfunktion zur Funktion ceil() ist die Funktion floor(). Return-Wert: : Die Funktion liefert ein double-Wert als Ergebnis zurück. Querverweis : floor fmod Beispiel : double x1 = 2.3; double x2 = -2.7; printf(“ceil(%4.1f) = %4.1f\n“,x1,ceil(x1)); printf(“ceil(%4.1f) = %4.1f\n“,x2,ceil(x2)); Ergebnis : ceil(2.3) = 3.0 ceil(-2.7) = -2.0 UNIX : Solaris 2.x / SunOS 4.1.x : wie oben Beispiel zur Funktion ceil() #include <math.h> #include <stdio.h> int main(void) { double zahl = 123.54; double unten, oben; unten = floor(zahl); oben = ceil(zahl); printf("urspruengliche Zahl: %5.2lf\n", zahl); printf("abgerundet: %5.2lf\n", unten); printf("aufgerundet: %5.2lf\n", oben); return 0; 4.15. CEIL() } 55 56 4.16 KAPITEL 4. FUNKTIONEN chdir() Name : chdir — wechselt das aktuell gesetze Directory. Benutzung : int chdir(const char *path); Prototyp in : <dir.h> Beschreibung : chdir() (change directory) wechselt in das durch path spezifizierte Verzeichnis. Die Pfadangabe path kann die Laufwerksbezeichnung mit enthalten (DOS). Return-Wert: : Die Funktion liefert bei fehlerfreier Ausführung den Wert 0, sonst -1. Zusätzlich wird die Variable errno gesetzt. Querverweis : getcurdir mkdir system getcwd rmdir Beispiel : if (chdir (“a:\test“) != 0) { puts(“Verzeichnis- oder Laufwerksname falsch“); } /* end if */ Ergebnis UNIX : : Solaris 2.x : Mit Headerdatei <unistd.h>, sonst wie oben SunOS 4.1.x : Mit Headerdatei <unistd.h>, sonst wie oben 4.16. CHDIR() Beispiel zur Funktion chdir() /* Beispiel fuer TURBO C ! */ #include <stdio.h> #include <stdlib.h> #include <dir.h> char alt_dir[MAXDIR]; char neu_dir[MAXDIR]; /* Wechselt das momentan gesetzte Directory */ int main(void) { if (getcurdir(0, alt_dir)) { perror("getcurdir()"); exit(1); } printf("Aktuelles Directory ist: \\%s\n", alt_dir); if (chdir("\\")) { perror("chdir()"); exit(1); } if (getcurdir(0, neu_dir)) { perror("getcurdir()"); exit(1); } printf("Aktuelles Directory ist jetzt: " "\\%s\n", neu_dir); printf("\nIn das urspruengliche Directory " "zurueckwechseln: \\%s\n", alt_dir); if (chdir(alt_dir)) { perror("chdir()"); exit(1); } return 0; } 57 58 4.17 KAPITEL 4. FUNKTIONEN chmod() Name : chmod — ändert die Zugriffsrechte einer Datei. Benutzung : int chmod(char *name, int permission); Prototyp in : <sys\stat.h> /* Def. der symbol. Konstanten */ <io.h> /* Prototyp der Funktion */ Beschreibung : chmod() (change mode) ändert die Zugriffsrechte der Datei name durch die mit permission gesetzten Rechte. Als permission kann eine vierstellige Oktalzahl angegeben werden, wobei die einzelnen Bits die unter UNIX üblichen Bedeutung haben. Für permission sollten die in sys\stat.h definierten symbolischen Konstanten benutzt werden. Unter DOS werden nur die folgenden Werte verwendet: permission Bedeutung S IWRITE nur Schreiben S IREAD nur Lesen S IREAD — S IWRITE Lesen und Schreiben. Jeder andere Wert wird ignoriert. Da unter DOS jede Datei lesbar ist, sind S IREAD — S IWRITE und S IWRITE gleichbedeutend. Return-Wert: : Die Funktion liefert die Zahl 0 zurück, wenn die Zugriffsrechte erfolgreich geändert wurden. Im Fehlerfall ist -1 der ReturnWert und die Fehlervariable errno erhält den Wert ENOENT (= no such file or directory). Querverweis : chmod Beispiel : if (chmod(“test.dat“,S IREAD) == -1) fprintf(stderr,“Kann Zugriffsrecht nicht aendern \n“); UNIX : Solaris 2.x : Nur <sys/stat.h> muß eingebunden werden SunOS 4.1.x : Nur <sys/stat.h> muß eingebunden werden 4.17. CHMOD() Beispiel zur Funktion chmod() #include <sys\stat.h> #include <stdio.h> #include <io.h> #include <string.h> #include <fcntl.h> #include <process.h> void make_read_only(char *filename); int main(void) { int handle; char buf[11] = "0123456789"; make_read_only("NOTEXIST.FIL"); /* aendert den voreingestellten Dateimodus von Text auf binaer */ _fmode = O_BINARY; /* erzeugt eine binaere Datei fuer lesenden und schreibenden Zugriff */ handle = creat("MYFILE.FIL", S_IREAD | S_IWRITE); /* versucht 10 Bytes in die Datei zu schreiben */ if (write(handle, buf, strlen(buf)) == -1) { printf("Fehler beim Schreibversuch!\n"); exit(1); } /* schliesst die Datei */ close(handle); make_read_only("MYFILE.FIL"); return 0; } void make_read_only(char *filename) { int stat; stat = chmod(filename, S_IREAD); if (stat) printf("Konnte %s nicht als read-only " "markieren!\n", filename); else printf("%s als read-only markiert!\n", filename); } 59 60 KAPITEL 4. FUNKTIONEN 4.18 clearerr() Name : clearerr — setzt die Fehlerflags einer offenen Datei zurück. (ANSI) Benutzung : void clearerr(FILE ∗fp); Prototyp in : <stdio.h> Beschreibung : clearerr() (clear error) löscht das Fehler-Flag und das DateiendeFlag der mit dem File-Pointer fp verbundenen Datei. Diese Funktion wird üblicherweise im Zusammenhang mit Fehlerbehandlungs-Routinen für die Datei-E/A benutzt. Return-Wert: : Keiner Querverweis : eof feof ferror perror Beispiel UNIX s.u. Solaris 2.x / SunOS 4.1.x : wie oben : : Beispiel zur Funktion clearerr() #include <stdio.h> int main(void) { FILE *fp; char ch; /* fp /* ch oeffnet eine Datei zum Schreiben */ = fopen("DUMMY.FIL", "w"); loest durch einen Leseversuch eine Fehlerbedingung aus */ = getc(fp); if ferror(fp) { /* zeigt die Fehlermeldung an */ printf("Fehler beim Lesen der Datei DUMMY.FIL\n"); /* setzt die Fehlerbedingung und den EOF-Indikator zurueck */ clearerr(fp); } fclose(fp); return 0; } 4.19. CLOCK() 4.19 61 clock() Name : clock — bestimmt die Prozessorzeit, die das Programm bisher verbraucht hat. (ANSI) Benutzung : clock t clock(void); Prototyp in : <time.h> Beschreibung : clock() (clock) bestimmt die Prozessorzeit, die das Programm bisher verbraucht hat. Der Datentyp clock t ist in time.h als long definiert. Die Einheit für die Prozessorzeit ist abhängig vom Compiler. Durch die Division mit der in time.h definierten Konstanten CLK TCK wird das Ergebnis in Sekunden umgerechnet. Return-Wert: : Die Funktion liefert die Prozessorzeit in einer systemabhängigen Einheit (Ticks) zurück. Wenn die Prozessorzeit nicht bestimmt oder dargestellt werden kann, ist der Return-Wert -1. Querverweis : time Beispiel : s.u. UNIX : Solaris 2.x : wie oben SunOS 4.1.x : long clock() (allerdings nicht in time.h definiert; kein Include-File notwendig) Beispiel zur Funktion clock() #include <time.h> #include <stdio.h> int main(void) { clock_t end; printf("Druecken Sie eine beliebige Taste!\n"); getch(); end = clock(); printf("%lf Sekunden sind seit Programmstart " "verstrichen;\nTaste druecken!\n", end / CLK_TCK); getch(); return 0; } 62 KAPITEL 4. FUNKTIONEN 4.20 close() Name : close — schließt eine Datei. Benutzung : int close(int fd); Prototyp in : <io.h> Beschreibung : close() (close) schließt eine mit dem File-Handle fd verbundene Datei. Der File-Handle ist der Rückgabewert der Funktionen creat() oder open. Return-Wert: : Die Funktion liefert den Wert 0 als Ergebnis zurück, falls die Datei geschlossen werden konnte. Im Fehlerfall wird -1 zurückgegeben und die Fehlervariable errno wird entsprechend gesetzt. Querverweis : chsize creatnew open sopen creat dup read write creat fclose Beispiel : s.u. UNIX : Solaris 2.x / SunOS 4.1.x : Headerfile ist <unistd.h>, sonst wie oben Beispiel zur Funktion close() #include #include #include #include <string.h> <fcntl.h> <io.h> <sys\stat.h> int main(void) { int handle; char buf[11] = "0123456789"; /* erzeugt eine Datei mit 10 Bytes */ handle = open("’NEW.FIL"’, O_RDWR | O_CREAT, S_IREAD | S_IWRITE ); write(handle, buf, strlen(buf)); /* schliesst die Datei */ close(handle); 4.20. CLOSE() return 0; } 63 64 4.21 KAPITEL 4. FUNKTIONEN cos() Name : cos — berechnet den Cosinus des Argumentes x. Benutzung : double cos(double x); complex cos(complex x); Prototyp in : <math.h> (reel) <complex.h> (complex) (ANSI) Beschreibung : cos() (cosine) berechnet den Cosinus des Argumentes x. Der Wert von x wird als Bogenmaß interpretiert. Das Argument x wird durch Modulodivision in den Bereich 0 bis 2*pi transformiert, wobei pi = 3.1415927... ist. Ist der Absolutwert des Argumentes sehr groß, so kann daraus eine zu große Ungenauigkeit für das Ergebnis entstehen. Return-Wert: : Die Fucosnktion gibt den Cosinus von x im Bogenmaß zurück. Der Wert liegt im Bereich von -1 und +1. Im Fehlerfall, wenn der Argumentwert zu groß für ein signifikantes Ergebnis ist, wird der Wert 0 zurückgegeben. Es wird eine Fehlermeldung auf stderr ausgegeben, und die Fehler- variable errno erhält den Wert ERANGE (= range error). Fehlerbehandlung kann ev. unter Verwendung der Funktion matherr geändert werden. Querverweis : acos atan2 matherr asin complex sin atan cosh tan Beispiel : double pi = 3.1415927; printf(“cos(0.0) = %6.4f\n“,cos(x)); printf(“cos(pi/2) = %6.4f\n“,cos(y)); printf(“cos(pi) = %6.4f\n“,cos(z)); Ergebnis : cos(0.0) = 1.0000 cos(pi/2) = 0.0000 cos(pi) = -1.0000 UNIX : Solaris 2.x / SunOS 4.1.x : wie oben 4.21. COS() Beispiel zur Funktion cos() #include <stdio.h> #include <math.h> int main(void) { double result; double x = 0.5; result = cos(x); printf("Der Cosinus von %lf ist %lf\n", x, result); return 0; } 65 66 4.22 KAPITEL 4. FUNKTIONEN cosh() Name : cosh — berechnet den Cosinus Hyperbolicus des Argumentes x. (ANSI) Benutzung : double cosh(double x); complex cosh(complex x); Prototyp in : <math.h> (reel) <complex.h> (complex) Beschreibung : cosh() hyperbolic cosine berechnet den Cosinus Hyperbolicus des Argumentes x. Return-Wert: : Die Funktion gibt den Cosinus Hyperbolicus von x im Bogenmaß zurück. Der Wert ist größer gleich +1. Ist das Ergebnis zu groß, so wird HUGE VAL zurückgegeben und die Fehlervariable errno erhält den Wert ERANGE (=range error). Querverweis : acos atan2 matherr tan asin complex sin tanh atan cos sinh Beispiel : printf(“cosh(-2.0) = %6.4f\n“,cosh(-2.0)); printf(“cosh(0.0) = %6.4f\n“,cosh(0.0)); printf(“cosh(2.0) = %6.4f\n“,cosh(2.0)); Ergebnis : UNIX : cosh(-2.0) = 3.7622 cosh(0.0) = 1.0000 cosh(2.0) = 3.7622 Solaris 2.x / SunOS 4.1.x : wie oben Beispiel zur Funktion cosh() #include <stdio.h> #include <math.h> int main(void) { double result; double x = 0.5; result = cosh(x); printf("Der Cosinus hyperbolicus von \ %lf ist %lf\n", x, result); return 0; } 4.23. CREAT() 4.23 67 creat() Name : creat — erzeugt eine neue oder überschreibt eine bereits vorhandene Datei. (ANSI) Benutzung : int creat(char *name, int permission); Prototyp in : <sys\stat.h> (Def. symbolischer Konstanten) <io.h> (Prototyp) Beschreibung : creat() (creat) erzeugt eine neue Datei mit dem Dateinamen name und eröffnet sie zum Schreiben. Die Zugriffsrechte werden über permission für die spätere Öffnung festgelegt, wobei permission die Bedeutung unter UNIX hat. Eine bereits existierende Datei mit Schreibrecht wird auf die Länge 0 verkürzt. Die vorhandenen Zugriffsrechte verändern sich dadurch nicht. Für permission sollten die in sys\stat.h definierten symbolischen Konstanten benutzt werden. Unter DOS werden nur die unter chmod() beschriebenen Konstanten verwendet. creat() soll durch open(),fopen(),...usw. ersetzt werden. Return-Wert: : Die Funktion gibt einen File-Handle zurück, wenn die Datei eröffnet werden kann. Im Fehlerfall ist der Return-Wert -1 und die Fehlervariable errno erhält eine der folgen Konstanten: Konstante Bedeutung EACCES Datei schreibgeschützt EMFILE zu viele Dateien eröffnet ENOENT ungültiger Dateiname Querverweis : chmod close dup2 open chmod creatnew fmode sopen chsize creattemp fopen write close dup Beispiel : UNIX : if ((fd = creat(“test.dat“,S IREAD)) == -1) printf(“Datei %s kann nicht erzeugt werden \n“, “test.dat“); Solaris 2.x / SunOS 4.1.x : Headerfile ist <sys/stat.h>, sonst wie oben 68 KAPITEL 4. FUNKTIONEN Beispiel zur Funktion creat() #include #include #include #include <sys\stat.h> <string.h> <fcntl.h> <io.h> int main(void) { int handle; char buf[11] = "0123456789"; /* Aendert den voreingestellten Dateimodus von Text auf binaer */ _fmode = O_BINARY; /* erzeugt eine binaere Datei fuer lesenden und schreibenden Zugriff */ handle = creat("DUMMY.FIL", S_IREAD | S_IWRITE); /* schreibt 10 Bytes in die Datei */ write(handle, buf, strlen(buf)); /* schliesst die Datei */ close(handle); return 0; } 4.24. CTIME() 4.24 69 ctime() Name : ctime — konvertiert Datum und Uhrzeit in einen String. (ANSI) Benutzung : char *ctime(const time t *zeit); Prototyp in : <include.h> Beschreibung : ctime() (convert time) konvertiert Datum und Uhrzeit in einen String. Hierbei wird der mit zeit angegebene Wert als Anzahl Sekunden interpretiert, die seit dem 1. Januar 1970 00:00:00 Uhr (GMT) vergangen sind. Der erzeugte String hat folgendes Format: Mon May 17 11 : 45 : 56 1988 Tag Monat std Min Sek Jahr Der Datentype time t ist in time.h definiert. Die Funktion ctime(zeit) ist wirkungsgleich mit asctime(localtime(zeit)). Die aktuelle Zeit in Sekunden kann mit der Funktion time() bestimmt werden. Return-Wert: : Die Funktion liefert die Anfangsadresse des Strings zurück. Querverweis : asctime ftime localtime timezone daylight getdate settime tzset difftime gmtime time Beispiel : time t sec; time(&sec); printf(”Datum und Uhrzeit %s \n“,ctime(&sec)); Ergebnis : Datum und Uhrzeit: Tue Oct 25 15:00:51 1988 UNIX : Solaris 2.x / SunOS 4.1.x : Headerdatei ist <time.h>, sonst wie oben Beispiel zur Funktion ctime() #include <stdio.h> #include <time.h> int main(void) { time_t t; time(&t); printf("Heutiges Datum und Uhrzeit ist: %s\n", ctime(&t)); 70 KAPITEL 4. FUNKTIONEN return 0; } 4.25. DIFFTIME() 4.25 difftime() Name : difftime — berechnet den Unterschied zwischen zwei Zeitangaben in Sekunden. (ANSI) Benutzung : double difftime(time t2, time t1); Prototyp in : <time.h> Beschreibung : difftime() (difference time) berechnet die Differenz time2 - time1 in Sekunden. Der datentyp time t ist in time.h als long definiert. Ein entsprechender Wert wird von der Funktion time() geliefert. Return-Wert: : Die Funktion liefert die Differenz time2 - time1 als double-Wert zurück. Querverweis : asctime localtime timezone ctime gmtime time Beispiel time t start, stop; long i; : printf(“ Ich arbeite ... \n“); time(&start); for (i=1; i <= 5000000; i++) ; time(&stop); printf(Fertig nach %.0f Sekunden \n“, difftime(stop,start)); Ergebnis UNIX : : Solaris 2.x : wie oben SunOS 4.1.x : nicht vorhanden 71 72 KAPITEL 4. FUNKTIONEN Beispiel zur Funktion difftime() #include #include #include #include <time.h> <stdio.h> <dos.h> <conio.h> int main(void) { time_t first, second; printf("Einen Moment bitte...\n"); first = time(NULL); /* liest die Systemuhr */ delay(2000); /* wartet 2 Sekunden */ second = time(NULL); /* liest noch einmal die Systemuhr */ printf("Die Zeitdifferenz betraegt %f " "Sekunden.\n",difftime(second,first)); printf("Druecken Sie eine Taste!"); getch(); return 0; } 4.26. DISABLE() 4.26 73 disable() Name : disable — unterdrückt Hardware-Interrupts. Benutzung : void disable(void); Prototyp in : <dos.h> Beschreibung : disable() (disable) unterdrückt alle Hardware-Interrupts außer NMI bis zum nächsten Aufruf von enable. Return-Wert: : keiner Querverweis : enable getvect Beispiel : long BILDSCHIRM = 0xB8000000; char *Text = “Test-disable“; unsigned char Farbe = 13; char far *Bildschirmadresse; (long) Bildschirmadresse = BILDSCHIRM; disable(); while (*Text != 0) { *Bildschirmadresse++ = *Text++; *Bildschirmadresse++ = Farbe; } /* end while */ enable(); Ergebnis : Test-disable (in violett) UNIX : Solaris 2.x / SunOS 4.1.x : nicht vorhanden 74 KAPITEL 4. FUNKTIONEN Beispiel zur Funktion disable() /***ACHTUNG: Dies ist eine Interrupt Serviceroutine. Wenn Sie dieses Programm mit Test stack overflow eingeschaltet compilieren, erhalten Sie keine korrekte ausfuehrbare Datei. */ #include <stdio.h> #include <dos.h> #include <conio.h> #define INTR 0x1C /* Der Timer-Interrupt */ typedef void interrupt (far *isr)(...); isr oldhandler; int zaehler=0; void interrupt handler(void) { /* alle Interrupts waehrend der Behandlung des Timer-Interrupts unterdruecken */ disable(); /* globalen Zaehler hochzaehlen */ zaehler++; /* Interrupts am Ende des Handlers wieder einschalten */ enable(); /* alte Routine aufrufen */ oldhandler(); } int main(void) { /* alten Interrupt-Vektor speichern */ oldhandler = (isr) getvect(INTR); /* neuen Interrupt-Handler installieren */ setvect(INTR, (isr) handler); /* Warteschleife, bis zaehler (vom Timer-Interrupt) auf 20 hochgezaehlt wird */ while (zaehler < 20) printf("Der Zaehler steht auf: %d\n", zaehler); /* installiert wieder den alten Interrupt-Handler */ setvect(INTR, oldhandler); return 0; } 4.27. DIV() 4.27 75 div() Name : div — dividiert zwei Integerwerte und liefert den Quotienten sowie den Rest über eine Struktur zurück. (ANSI) Benutzung : div t div(int x, int y); Prototyp in : <stdlib.h> Beschreibung : div() divide dividiert x durch y und legt den ganzzahligen Anteil des Ergebnisses sowie den Divisionsrest in einer Struktur vom Type div t ab. Dieser Strukturtyp ist in der Header-Datei stdlib.h wie folgt definiert: typedef struct { int qout; int rem; } div t; Für die Division von long-Werten kann die Funktion ldiv() verwendet werden. Return-Wert: : Die Funktion liefert das Ergebnis als Struktur vom Typ div t. Querverweis Beispiel : : Ergebnis UNIX : : ldiv div t ergeb; int = x; printf(“%d \n“,div(x)); 2 Solaris 2.x : wie oben SunOS 4.1.x : nicht vorhanden Beispiel zur Funktion div() /* div-Beispiel */ #include <stdlib.h> #include <stdio.h> div_t x; int main(void) { x = div(10,3); printf("10 geteilt durch 3 = %d Rest %d.\n", x.quot, x.rem); return 0; } 76 4.28 KAPITEL 4. FUNKTIONEN ecvt() Name : ecvt — wandelt eine Gleitpunktzahl in eine Zeichenkette um. Benutzung : char *ecvt(double wert, int anzahl, int *dez pkt, int *zeichen); Prototyp in : <stdlib.h> Beschreibung : ecvt() (ecvt) wandelt wert in eine mit \0 abschließende Zeichenkette mit anzahl Zeichen um und liefert als Funktionswert den Zeiger der Zeichenkette. Der int -Zeiger dez pkt liefert die retative Position des Dezimalpunktes von Beginn der Zeichenkette aus gesehen (ein negativer Wert in dez pkt sagt aus, daß der Dezimalpunkt links von dem zurückgegebenen Zeichen steht). Ist das Zeichen des Ergebnisses negativ, liefert der int-Zeiger zeichen einen Wert ungleich 0. Das letzte Zeichen wird gerundet. Return-Wert: : Zeiger auf Zeichenkette Querverweis : gcvt Beispiel : char *str; double zahl = -1234567.89099059; int dez pkt, zeichen; puts(ecvt(zahl, 13, &dez pkt, &zeichen)); printf(“\n Der Punkt steht an %d.Stelle“,dez pkt); if (zeichen != 0) { puts(“\n Die Zahl ist negativ“); } /* end if */ Ergebnis : -1234567.89099059 Der Punkt steht an 7. Stelle Die Zahl ist negativ UNIX : Solaris 2.x / SunOS 4.1.x : Headerdatei ist <floatingpoint.h>, sonst wie oben 4.28. ECVT() Beispiel zur Funktion ecvt() #include <stdlib.h> #include <stdio.h> #include <conio.h> int main(void) { char *string; double value; int dec, sign; int ndig = 10; clrscr(); value = 9.876; string = ecvt(value, ndig, &dec, &sign); printf("string = %s; dec = %d; " "sign = %d\n", string, dec, sign); value = -123.45; ndig= 15; string = ecvt(value,ndig,&dec,&sign); printf("string = %s; dec = %d; " "sign = %d\n", string, dec, sign); value = 0.6789e5; /* Exponentialdarstellung */ ndig = 5; string = ecvt(value,ndig,&dec,&sign); printf("string = %s; dec = %d; " "sign = %d\n", string, dec, sign); return 0; } 77 78 KAPITEL 4. FUNKTIONEN 4.29 enable() Name : enable — aktiviert Hardware-Interrupts. Benutzung : void enable(void); Prototyp in : <dos.h> Beschreibung : enable() (enable) lässt Interrupts zu. Return-Wert: : keiner Querverweis : disable getvect Beispiel : s. disable UNIX : Solaris 2.x / SunOS 4.1.x : nicht vorhanden Beispiel zur Funktion enable() /***ACHTUNG: Dies ist eine InterruptServiceroutine. Wenn Sie dieses Programm mit Test stack overflow eingeschaltet compilieren, erhalten Sie keine korrekte ausfuehrbare Datei. */ #include <stdio.h> #include <dos.h> #include <conio.h> #define INTR 0x1C /* Der Timer-Interrupt */ typedef void interrupt (far *isr)(...); isr oldhandler; int zaehler=0; void interrupt handler(void) { /* alle Interrupts waehrend der Behandlung des Timer-Interrupts unterdruecken */ disable(); /* globalen Zaehler hochzaehlen */ zaehler++; /* Interrupts am Ende des Handlers wieder 4.29. ENABLE() einschalten */ enable(); /* alte Routine aufrufen */ oldhandler(); } int main(void) { /* alten Interrupt-Vektor speichern */ oldhandler = (isr) getvect(INTR); /* neuen Interrupt-Handler installieren */ setvect(INTR, (isr) handler); /* Warteschleife, bis zaehler (vom Timer-Interrupt) auf 20 hochgezaehlt wird */ while (zaehler < 20) printf("Der Zaehler steht auf: %d\n", zaehler); /* installiert wieder den alten Interrupt-Handler */ setvect(INTR, oldhandler); return 0; } 79 80 4.30 KAPITEL 4. FUNKTIONEN exit() Name : exit — beendet das laufende Programm. Benutzung : void exit(int status); Prototyp in : <stdlib.h> (ANSI) Beschreibung : exit() (exit) beendet das laufende Programm. Vor dem endgültigen Abbruch werden sämtliche Dateipuffer geschrieben und offene Dateien geschlossen. Das Argument status ist der Exit-Code des Programms und kann vom aufrufenden Prozeß ausgewertet werden. Üblicherweise benutzt man den Wert 0, wenn das Programm korrekt abgelaufen ist. Ein von Null verschiedener Wert zeigt einen Fehler an. Im Unterschied zu der Funktion abort() bewirkt exit() eine normale Programmbeendigung, und es wird keine Meldung ausgegeben. Return-Wert: : keiner Querverweis : aexit abort exec keep spawn exit signal Beispiel : File *fp; . if ((fp = fopen(“test.dat“,“r“)) == NULL) { fprintf(stderr,“Datei %s kann nicht geöffnet werden \n“,“test.daty“); exit(1); } UNIX : Solaris 2.x / SunOS 4.1.x : Headerdatei ist <unistd.h>, sonst wie oben 4.30. EXIT() Beispiel zur Funktion exit() #include <stdlib.h> #include <conio.h> #include <stdio.h> void done(); int status; int main(void) { /* Definition einer Exit-Funktion */ atexit(done); printf("Geben Sie 1 oder 2 ein: "); status = getch(); /* Setzt den DOS Fehlercode */ exit(status - ’0’); /* Hinweis: Diese Zeile wird nie erreicht */ return 0; } void done() { printf("\nFertig! - Status = %d;\n",status-’0’); } 81 82 4.31 KAPITEL 4. FUNKTIONEN exp() Name : exp — berechnet e hoch x. Benutzung : double exp(double x); (reell) complex exp(complex x); (komplex) Prototyp in : <math.h> (reel) <complex.h> (komplex) (ANSI) Beschreibung : exp() (exponential) berechnet den Wert der Exponentialfunktion an der Stelle x, d.h. den Wert ex . Die Zahl e=2.718281 .. ist die Eulersche Zahl. Die Exponentialfunktion ist die Umkehrfunktion des natürlichen Logarithmus log(). Die komplexe Version ist definiert: exp(x + yi) = exp(x) ∗ (cos(y) + i ∗ sin(y)) und wahrscheinlich nicht portierbar ! Return-Wert: : Die Funktion gibt ex zurück. Im Fall eines Überlaufs wird HUGE VAL zurückgegeben, und die Fehlervariable errno erhält den Wert ERANGE (= range error). Fehlerbehandlung kann ev. unter Verwendung der Funktion matherr geändert werden. Querverweis : frexp log matherr pow10 ldexp log10 pow sqrt Beispiel : printf(“exp(-3.0) = %7.4f\n“,exp(-3.0)); printf(“exp(0.0) = %7.4f\n“,exp(0.0)); printf(“exp(3.0) = %7.4f\n“,exp(3.0)); Ergebnis : exp(-3.0) = 0.0498 exp(0.0) = 1.0000 exp(3.0) = 20.0855 UNIX : Solaris 2.x / SunOS 4.1.x : wie oben 4.31. EXP() Beispiel zur Funktion exp() #include <stdio.h> #include <math.h> int main(void) { double result; double x = 4.0; result = exp(x); printf("e hoch %lf = %lf\n", x, result); return 0; } 83 84 KAPITEL 4. FUNKTIONEN 4.32 fabs() Name : fabs — berechnet den Absolutwert einer Gleitpunktzahl. Benutzung : double fabs(double x); Prototyp in : <math.h> (ANSI) Beschreibung : fabs() (floating point abs) berechnet den Absolutwert der Gleitpunktzahl x. Für die Berechnung des Absolutwertes einer Zahl vom Typ int oder long kann die Funktion abs() bzw. labs() verwendet werden. Return-Wert: : Der Absolutwert von x, d.h. • x, f alls x ≥ 0, • −x, f alls x < 0 Querverweis Beispiel : : : abs cabs labs printf(“fabs(-9.5) = %3.1f \n“,fabs(-9.5)); printf(“fabs(2.7) = %3.1f \n“,fabs(2.7)); Ergebnis : fabs(-9.5) = 9.5 fabs(2.7) = 2.7 UNIX : Solaris 2.x / SunOS 4.1.x : wie oben Beispiel zur Funktion fabs() #include <stdio.h> #include <math.h> int main(void) { float zahl = -1234.0; printf("Der absolute Betrag von %f ist: %f\n", zahl, fabs(zahl)); return 0; } 4.33. FCLOSE() 4.33 85 fclose() Name : fclose — schließt eine Datei. Benutzung : int fclose(FILE *fp); Prototyp in : <stdio.h> (ANSI) Beschreibung : fclose() (file close) schließt die mit dem File-Pointer fp verbundene Datei. Falls die Datei zum Schreiben eröffnet wurde, überträgt fclose() den Inhalt des Dateipuffers in die Datei. Der Hauptspeicherbereich des I/O-Puffers wird wieder freigegeben. Um sämtliche vom Programm eröffneten Dateien zu schließen, kann die Funktion fcloseall() verwendet werden. Die Funktion exit() ruft zum Schließen noch aller Dateien fclose() auf. Return-Wert: : Die Funktion liefert den Wert 0, wenn die Datei geschlossen werden konnte. Bei einem ungültigen File-Pointer wird der Wert EOF zurückgegeben. Querverweis : close fcloseall fflush flushall fopen freopen Beispiel : s.u. UNIX : Solaris 2.x / SunOS 4.1.x : wie oben Beispiel zur Funktion fclose() #include <string.h> #include <stdio.h> int main(void) { FILE *fp; char buf[11] = "0123456789"; /* erzeugt eine Datei mit 10 Bytes */ fp = fopen("DUMMY.FIL", "w"); fwrite(buf, strlen(buf), 1, fp); /* schliesst die Datei */ fclose(fp); return 0; } 86 KAPITEL 4. FUNKTIONEN Beispiel zur Funktion fclose() #include <string.h> #include <stdio.h> int main(void) { FILE *f_inp, *f_out; char quelle[25], ziel[25]; char ch; puts ("\nEinfaches Kopieren von Dateien\n"); printf("Name der Quelldatei :"); gets(quelle); printf("Name der Zieldatei :"); gets(ziel); f_inp = fopen(quelle,"r"); f_out = fopen(ziel,"w"); ch = 0; while ((ch = getc(f_inp)) != EOF) putc(ch, f_out); fclose(f_inp); fclose(f_out); puts("Fertig !!!"); return 0; } 4.34. FEOF() 4.34 87 feof() Name : feof — überprüft, ob das Ende der Datei erreicht wurde. Benutzung : int feof(FILE *fp); Prototyp in : <stdio.h> (ANSI) Beschreibung : feof() (file eof) überprüft, ob das Ende der mit dem File-Pointer fp verbundene Datei erreicht wurde. Das Dateiende wird über das Dateiende-Flag erkannt, welches bei Erreichen des Endes der Datei gesetzt wird. Das Dateiende-Flag bleibt solange gesetzt, bis eine der Funktionen rewind(), fseek(), oder clearerr() aufgerufen wird. Return-Wert: : Das Makro liefert einen von 0 verschiedenen Wert, wenn das Dateiende-Flag gesetzt ist, sonst 0. Querverweis : clearerr eof ferror perror Beispiel : s.u. UNIX : Solaris 2.x / SunOS 4.1.x : wie oben 88 KAPITEL 4. FUNKTIONEN Beispiel zur Funktion feof() #include <stdio.h> int main(void) { FILE *stream; char ch; /* oeffnet eine Datei zum Lesen */ if ((stream = fopen("DUMMY.DAT", "r")) == NULL) { perror ("Fehler bei fopen()"); exit(1); } /* liest ein Zeichen aus der Datei */ ch = fgetc(stream); /* sucht nach dem Dateiende EOF */ if (feof(stream)) printf("Wir haben das Dateiende erreicht.\n"); else printf("Dateiende noch nicht erreicht.\n"); /* schliesst die Datei */ fclose(stream); return 0; } 4.35. FERROR() 4.35 89 ferror() Name : ferror — Fehlerüberprüfung bei Zugriff auf Datei. Benutzung : int ferror(FILE *fp); Prototyp in : <stdio.h> (ANSI) Beschreibung : ferror() (file error) überprüft, ob ein Schreib- oder Lesefehler beim Zugriff auf die mit dem File-Pointer fp verbundene Datei aufgetreten ist. Ein Schreib- und Lesefehler wird über das Fehlerflag der Datei erkannt. Nach Auftreten eines Fehlers bleibt das Fehler-Flag solange gesetzt, bis eine der Funktionen clearerr() oder rewind() aufgerufen wird. Return-Wert: : Das Makro liefert einen von 0 verschiedenen Wert, wenn das FehlerFlag gesetzt ist, sonst 0. Querverweis : clearerr eof feof fopen gets perror Beispiel : s.u. UNIX : Solaris 2.x / SunOS 4.1.x : wie oben 90 KAPITEL 4. FUNKTIONEN Beispiel zur Funktion ferror() #include <stdio.h> int main(void) { FILE *stream; char ch; /* oeffnet eine Datei zum Schreiben */ stream = fopen("DUMMY.FIL", "w"); /* erzwingt eine Fehlerbedingung durch Leseversuch */ ch = getc(stream); /* Fehlertest in Dateistream */ if ferror(stream) { /* zeigt eine Fehlermeldung an */ printf("Fehler beim Lesen aus DUMMY.FIL\n"); /* beseitigt Fehlerbedingung und setzt EOF-Indikator zurck */ clearerr(stream); } fclose(stream); return 0; } 4.36. FFLUSH() 4.36 91 fflush() Name : fflush — Dateipuffer leeren. Benutzung : int fflush(FILE *fp); Prototyp in : <stdio.h> Beschreibung : (ANSI) fflush() (file flush) überträgt den Inhalt des Dateipuffers der mit dem File-Pointer fp verbundenen Datei. • Wurde die Datei zum Schreiben eröffnet, so wird der Inhalt des Dateipuffers in die Datei geschrieben. • Ist die Datei zum Lesen eröffnet, so wird der Puffer geleert. Nach dem Aufruf von fflush() bleibt die Datei eröffnet. Die Funktion hat keine Wirkung bei ungepufferten Dateien. Sollen die Dateipuffer aller zum Schreiben eröffneten Dateien übertragen werden, so ist die Funktion flushall() zu benutzen. Return-Wert: : Die Funktion liefert im Fehlerfall EOF, sonst den Wert 0 zurück. Querverweis : fclose flushall Beispiel : s.u. UNIX : Solaris 2.x / SunOS 4.1.x : wie oben 92 KAPITEL 4. FUNKTIONEN Beispiel zur Funktion fflush() #include #include #include #include <string.h> <stdio.h> <conio.h> <io.h> void flush(FILE *stream); int main(void) { FILE *stream; char msg[] = "Dies ist ein Test"; /* erzeugt eine Datei */ stream = fopen("DUMMY.FIL", "w"); /* schreibt etwas in die Datei */ fwrite(msg, strlen(msg), 1, stream); /* clrscr(); TURBO-C */ printf("Beliebige Taste druecken, um Daten in DUMMY.FIL zu schreiben:"); getch(); /* schreibt Daten in DUMMY.FIL, ohne die Datei zu schliessen */ flush(stream); printf("\nDatei wurde gefuellt, mit beliebiger Taste zurueck:"); getch(); return 0; } void flush(FILE *stream) { int duphandle; /* fuellt den internen Puffer des stream */ fflush(stream); /* erzeugt doppelten steam handle */ duphandle = dup(fileno(stream)); /* schliesst das Handle-Duplikat, um den DOS Puffer zu fuellen */ close(duphandle); } 4.37. FGETC() 4.37 93 fgetc() Name : fgetc — liest ein Zeichen aus Datei. Benutzung : int fgetc(FILE *fp); Prototyp in : <stdio.h> (ANSI) Beschreibung : fgetc() (file get character) liest aus der Datei, die mit dem File-Pointer fp verbundene ist, das Zeichen von der aktuellen Position. Anschließend wird die aktuelle Position um 1 erhöht. Die Funktion fgetc() ist wirkungsgleich mit dem Makro getc(). Die entsprechende Ausgabefunktion fputc(). Return-Wert: : Das gelesene Zeichen wird zurückgegeben. Im Fehlerfall oder beim Erreichen des Dateiendes liefert die Funktion EOF. Querverweis : fgetchar fputc getc getch getchar getche ungetc ungetch Beispiel : s.u. UNIX : Solaris 2.x / SunOS 4.1.x : wie oben 94 KAPITEL 4. FUNKTIONEN Beispiel zur Funktion fgetc() #include <string.h> #include <stdio.h> #include <conio.h> int main(void) { FILE *stream; char string[] = "Das ist ein Test!"; char ch; /* oeffnet eine Datei zum Lesen und Schreiben */ stream = fopen("DUMMY.FIL", "w+"); /* schreibt einen String in die Datei */ fwrite(string, strlen(string), 1, stream); /* positioniert auf den Anfang der Datei */ fseek(stream, 0, SEEK_SET); do { /* liest ein Zeichen aus der Datei */ ch = fgetc(stream); /* gibt das Zeichen am Bildschirm aus */ putch(ch); } while (ch != EOF); fclose(stream); return 0; } 4.38. FGETPOS() 4.38 95 fgetpos() Name : fgetpos — ermittelt die aktuelle Position in der Datei. Benutzung : int fgetpos(FILE *fp, fpos t *ppos); Prototyp in : <stdio.h> (ANSI) Beschreibung : fgetpos() (file get position) ermittelt die aktuelle Position in der Datei, die mit dem File-Pointer fp verbunden ist. Es wird die aktuelle Position in die durch ppos adressierte Variable. Dieser Wert wird von der Funktion fsetpos() verwendet, um später den Seek-Zeiger wieder an diese Stelle zu positionieren. Der Typ fpos t ist in stdio.h als long definiert. Return-Wert: : Im Fehlerfall wir ein von 0 verschiedener Wert zurückgegeben und die Fehlervariable errno erhält den Wert EINVAL (= invalid argument) oder EBADF (= bad file number) erhält. Konnte die Funktion ordnungsgemäß ausgeführt werden, wird der Wert 0 zurückgegeben. Querverweis : fseek fsetpos ftell tell Beispiel : s.u. UNIX : Solaris 2.x : wie oben SunOS 4.1.x : nicht vorhanden 96 KAPITEL 4. FUNKTIONEN Beispiel zur Funktion fgetpos() #include <string.h> #include <stdio.h> int main(void) { FILE *stream; char string[] = "Das ist ein Test!"; fpos_t filepos; /* oeffnet eine Datei zum Lesen und Schreiben */ stream = fopen("DUMMY.FIL", "w+"); /* schreibt einen String in die Datei */ fwrite(string, strlen(string), 1, stream); /* ermittelt die Position des Dateizeigers */ fgetpos(stream, &filepos); printf("Der Dateizeiger steht auf Byte " "Nr.: %ld\n", filepos); fclose(stream); return 0; } 4.39. FGETS() 4.39 97 fgets() Name : fgets — liest ein Zeichenkette aus einer Datei. Benutzung : char *fgets(char *string, int n, FILE *fp); Prototyp in : <stdio.h> (ANSI) Beschreibung : fgets() (file get string) liest eine Zeichenkette aus der Datei, die mit dem File-Pointer fp verbunden ist. Die Zeichenkette wird in den durch string adressierten Speicherbereich mit dem String- Endezeichen \0 kopiert. Die Funktion bricht das Einlesen ab, sobald n-1 Zeichen eingelesen wurden oder der Zeilenvorschub \n erkannt und kopiert wurde. Die entsprechende Ausgabefunktion ist fputs(). Return-Wert: : Die Funktion gibt den Zeiger string, im Fehlerfall den NULL-Zeiger zurück. Querverweis : cgets fputs gets Beispiel : s.u. UNIX : Solaris 2.x / SunOS 4.1.x : wie oben 98 KAPITEL 4. FUNKTIONEN Beispiel zur Funktion fgets() #include <string.h> #include <stdio.h> int main(void) { FILE *stream; char string[] = "Das ist ein Test,\n" "und das die zweite Zeile"; char msg[20]; /* oeffnet eine Datei zum Lesen und Schreiben */ stream = fopen("DUMMY.FIL", "w+"); /* schreibt einen String in die Datei */ fwrite(string, strlen(string), 1, stream); /* positioniert auf den Anfang der Datei */ fseek(stream, 0, SEEK_SET); /* liest einen String aus der Datei */ fgets(msg, strlen(string)+1, stream); /* gibt den String am Bildschirm aus */ printf("%s", msg); fclose(stream); return 0; } 4.40. FILENO() 4.40 99 fileno() Name : fileno — ermittelt den File-Handle der Datei. Benutzung : int fileno(FILE *fp); Prototyp in : <stdio.h> Beschreibung : fileno() (file number) ermittelt den File-Handle der Datei, die mit dem File-Pointer fp verbunden ist. Besitzt eine Datei mehrere File-Handles, so wird der beim ersten Eröffnen der Datei zugewiesene File-Handle zurückgegeben. Return-Wert: : Die Funktion gibt den File-Handle zurück. Bei ungültigem File-Pointer ist der Return-Wert undefiniert. Querverweis : fopen freopen Beispiel : s.u. UNIX : Solaris 2.x / SunOS 4.1.x : wie oben Beispiel zur Funktion fileno() #include <stdio.h> int main(void) { FILE *stream; int handle; /* erzeugt eine Datei */ stream = fopen("DUMMY.FIL", "w"); /* liefert den Handle der ueber Stream angegebenen Datei */ handle = fileno(stream); /* zeigt die Handlenummer an */ printf("Handlenummer: %d\n", handle); /* schliesst die Datei */ fclose(stream); return 0; } 100 KAPITEL 4. FUNKTIONEN 4.41 floor() Name : floor — berechnet die größte ganze Zahl, die kleiner oder gleich x ist. (ANSI) Benutzung : double floor(double x); Prototyp in : <math.h> Beschreibung : floor() (floor = Boden) berechnet die größte ganze Zahl, die kleiner oder gleich x ist. Die Gegenfunktion zu floor() ist die Funktion ceil(). Return-Wert: : Die Funktion gibt das Ergebnis als double-Wert zurück. Querverweis Beispiel : : : ceil fmod printf(“floor(2.7) = %4.1f \n“,floor(2.7)); printf(“floor(-3.1) = %4.1f \n“,floor(-3.1)); Ergebnis : floor(2.7) = 2.0 floor(-3.1) = -3.1 UNIX : Solaris 2.x / SunOS 4.1.x : wie oben Beispiel zur Funktion floor() #include <math.h> #include <stdio.h> int main(void) { double zahl = 123.54; double ab, auf; ab = floor(zahl); auf = ceil(zahl); printf("Ausgangszahl printf("abgerundet printf("aufgerundet return 0; } %10.2lf\n", zahl); %10.2lf\n", ab); %10.2lf\n", auf); 4.42. FLUSHALL() 4.42 101 flushall() Name : flushall — Dateipuffer aller geöffneten Dateien leeren. Benutzung : int flushall(void); Prototyp in : <stdio.h> Beschreibung : flushall() (flush all) überträgt die Inhalte aller mit File-Pointer eröffneten Dateien. Hierzu gehören auch die mit den File-Pointern stdin, stdout,.... eröffneten Standarddateien. Die Inhalte der Dateipuffer aller nur zum Lesen eröffneten Dateien werden gelöscht. Bei einem erneuten Lesezugriff werden neue Daten aus der entsprechenden Datei in den Dateipuffer gelesen. Nach dem Aufruf der Funktion bleiben alle Dateien eröffnet. Um nur einen Dateipuffer in die entsprechende Datei zu übertragen, ist die Funktion fflush() geeignet. Return-Wert: : Die Funktion liefert die Anzahl der zum Lesen bzw. Schreiben geöffneten Dateien, einschließlich der Standarddateien zurück. Im Fehlerfall gibt es keinen speziellen Return-Wert. Querverweis : fclose fcloseall fflush Beispiel : s.u. UNIX : Solaris 2.x / SunOS 4.1.x : nicht vorhanden (fflush() mit Null-Pointer hat gleiche Funktion, gibt aber keine Anzahl aus) Beispiel zur Funktion flushall() #include <stdio.h> int main(void) { FILE *stream; /* erzeugt eine Datei */ stream = fopen("DUMMY.FIL", "w"); /* entleert die Puffer aller offenen Streams*/ printf("%d Streams wurden aktualisiert.\n", flushall()); /* schliesst die Datei */ fclose(stream); return 0; } 102 KAPITEL 4. FUNKTIONEN 4.43 fmod() Name : fmod — berechnet x modulo y. Benutzung : double fmod(double x, double y); Prototyp in : <math.h> (ANSI) Beschreibung : fmod() float modulo berechnet x modulo y. Es wird der Rest der Division xy berechnet. Return-Wert: : Die Funktion liefert das Ergebnis der Modulo-Division als double zurück. Querverweis Beispiel : : ceil floor modf double x = 9.5, y = 4.5; printf(“fmod(%3.1f,%3.1f) = %3.1f \n“,x,y,fmod(x,y)); Ergebnis : fmod(9.5,4.5) = 0.5 UNIX : Solaris 2.x / SunOS 4.1.x : wie oben Beispiel zur Funktion fmod() #include <stdio.h> #include <math.h> int main(void) { double x = 5.3, y = 2.0; printf("%lf / %lf = %lf Rest %lf\n", x, y, floor(x/y), fmod(x,y)); return 0; } 4.44. FOPEN() 4.44 103 fopen() Name : fopen — eröffnet eine Datei. (ANSI) Benutzung : FILE *fopen(const char *name, const char *modus); Prototyp in : <stdio.h> Beschreibung : Hinweis: : fopen() (file open) eröffnet eine Datei mit dem Namen name und der Zugriffsart modus. Mögliche Zugriffsarten sind: modus r r+ Eröffnung zum Lesen zum Lesen und Schreiben Anmerkung Die Datei muß schon existieren. w w+ zum Schreiben zum Schreiben und Lesen Existiert die Datei nicht, so wird sie neu erzeugt; sonst geht der Dateiinhalt verloren. a a+ zum Schreiben ab Dateiende zum Schreiben ab Dateiende und Lesen Existiert die Datei noch nicht, so wird sie neu erzeugt. Nach der Eröffnung einer Datei zeigt der Seek-Zeiger in der Datei auf das erste Byte. Bei einer im Modus a oder a+ eröffneten Datei wird der Seek-Zeiger vor jeder Operation an das Ende der Datei positioniert. Daten in der Datei können daher nicht überschrieben werden. Soll bei einer Datei, die Modus r+, w+, oder a+ eröffnet wurde, zwischen Lesen und Schreiben gewechselt werden, so muß zuvor einer der Funktionen fseek(), rewind(), oder fsetpos() aufgerufen werden. Unter CP/M, DOS, und OS/2 muß zwischen Text-und Binär-Modus unterschieden werden. Dieses kann durch Anhängen des Buchstabens t = Textmodus oder b = Binärmodus an den Modusstring erfolgen. Bei Programmstart werden folgende Filepointer automatisch eröffnet: Filepointer stdin stdout stderr Return-Wert: : Anmerkung Standardeingabe (Terminal) Standardausgabe (Terminal) Standardfehlermeldungen (Terminal) Die Funktion liefert als Ergebnis einen Filepointer zurück, der mit der Datei name verbunden ist. Der Datentyp FILE ist in stdio.h definiert. Konnte die Datei nicht eröffnet werden, wird ein NULL-Zeiger zurückgegeben. 104 KAPITEL 4. FUNKTIONEN Querverweis : creat fclose ferror fread freopen fseek fwrite open rewind Beispiel : s.u. UNIX : Solaris 2.x / SunOS 4.1.x : wie oben Beispiel zur Funktion fopen() /* Dieses Programm erzeugt eine Sicherungskopie der Datei AUTOEXEC.BAT */ #include <stdio.h> int main(void) { FILE *in, *out; if ((in = fopen("C:\\AUTOEXEC.BAT", "rt"))== NULL) { fprintf(stderr, "Konnte Eingabedatei nicht oeffnen.\n"); return 1; } if ((out = fopen("C:\\AUTOEXEC.BAK", "wt"))== NULL) { fprintf(stderr, "Konnte Ausgabedatei nicht oeffnen.\n"); return 1; } while (!feof(in)) fputc(fgetc(in), out); fclose(in); fclose(out); return 0; } 4.45. FPRINTF() 4.45 105 fprintf() Name : fprintf — schreibt formatiert in eine Datei. Benutzung : int fprintf(FILE *fp, const *formatstring, arg1, arg2, . . . ); Prototyp in : <stdio.h> (ANSI) Beschreibung : fprintf() (file print formatted) schreibt den Format-String formatstring in die mit dem File-Pointer fp verbundene Datei. Die Anzahl der Formatbezeichner und der Argumente muß gleich sein. Formatbezeichner s. printf(). Return-Wert: : Die Funktion liefert die Anzahl der ausgegebenen Zeichen zurück. Im Fehlerfall wird EOF zurückgegeben. Querverweis Beispiel : : fscanf printf putc sprintf s.u. UNIX : Solaris 2.x / SunOS 4.1.x : wie oben Beispiel zur Funktion fprintf() #include <stdio.h> int main(void) { FILE *stream; int i = 100; char c = ’C’; float f = 1.234; /* oeffnet eine Datei fuer lesenden und schreibenden Zugriff */ stream = fopen("DUMMY.FIL", "w+"); /* schreibt einige Daten in die Datei */ fprintf(stream, "%d %c %f", i, c, f); /* schliesst die Datei */ fclose(stream); return 0; } 106 KAPITEL 4. FUNKTIONEN 4.46 fputc() Name : fputc — schreibt ein Zeichen in eine Datei. Benutzung : int fputc(int c, FILE *fp); Prototyp in : <stdio.h> (ANSI) Beschreibung : fputc() (file put character) schreibt das Zeichen c auf die aktuelle Position in die mit dem File-Pointer fp verbundene Datei. Die Funktion ist wirkungsgleich mit dem Makro putc(). Die entsprechende Funktion zum Lesen aus der Datei ist fgetc(). Return-Wert: : Die Funktion liefert das übergebene Zeichen zurück. Im Fehlerfall wird EOF zurückgegeben. Querverweis Beispiel : : fscanf printf putc sprintf s.u. UNIX : Solaris 2.x / SunOS 4.1.x : wie oben Beispiel zur Funktion fputc() #include <stdio.h> int main(void) { char msg[] = "Hello world!\n"; int i = 0; while (msg[i]) { fputc(msg[i], stdout); i++; } return 0; } 4.47. FPUTS() 4.47 107 fputs() Name : fputs — schreibt eine Zeichenkette in eine Datei. Benutzung : int fputs(const char *string, FILE *fp); Prototyp in : <stdio.h> (ANSI) Beschreibung : fputs() (file put string) schreibt die Zeichenkette string in die mit dem File-Pointer fp verbundene Datei. Das String-Endezeichen \0 wird nicht mit in die Datei übertragen. Die entsprechende Funktion zum Lesen aus der Datei ist fgets(). Return-Wert: : Die Funktion liefert einen von EOF verschiedenen Wert zurück. Im Fehlerfall wird EOF zurückgegeben. Querverweis Beispiel : : fgets gets puts s.u. UNIX : Solaris 2.x / SunOS 4.1.x : wie oben Beispiel zur Funktion fputs() #include <stdio.h> int main(void) { /* schreibt einen String zur Standardausgabe */ fputs("Hello world\n", stdout); return 0; } 108 4.48 KAPITEL 4. FUNKTIONEN fread() Name : fread — liest Daten aus einer Datei. Benutzung : size t fread(void *buffer, size t size, size t n, FILE *fp); Prototyp in : <stdio.h> (ANSI) Beschreibung : fread() (file read) liest bis zu n-Datenobjekte der Länge size aus der mit dem File-Pointer fp verbundene Datei in den Speicherbereich, auf dem buffer zeigt. Der Speicherbereich muß mindestens n*sizes Bytes groß sein. Der Datentyp size t ist in stdio.h als unsigned vereinbart. Die Gegenfunktion zu fread() ist fwrite(). Return-Wert: : Die Funktion liefert die tatsächlich eingelesenen Datenobjekte zurück. Ist die Anzahl kleiner als n, so wurde entweder das Dateiende erreicht oder es trat ein Fehler auf. Zur Unterscheidung sollte eine der Funktionen feof() oder ferror() verwendet werden. Querverweis Beispiel : : fopen fwrite printf read s.u. UNIX : Solaris 2.x / SunOS 4.1.x : wie oben 4.48. FREAD() Beispiel zur Funktion fread() #include <string.h> #include <stdio.h> int main(void) { FILE *stream; char msg[] = "Das ist ein Test!\n"; char buf[20]; if ((stream = fopen("DUMMY.FIL", "w+")) == NULL) { fprintf(stderr, "Konnte Ausgabedatei " "nicht oeffnen.\n"); return 1; } /* schreibt einige Daten in die Datei */ fwrite(msg, strlen(msg)+1, 1, stream); /* positioniert auf den Anfang der Datei */ fseek(stream, SEEK_SET, 0); /* liest die Daten und gibt sie am Bildschirm aus */ fread(buf, strlen(msg)+1, 1, stream); printf("%s", buf); fclose(stream); return 0; } 109 110 KAPITEL 4. FUNKTIONEN 4.49 free() Name : free — gibt einen dynamisch belegten Speicherbereich frei. Benutzung : void free(void *ptr); Prototyp in : <stdlib.h> und <alloc.h> (ANSI) Beschreibung : free (free) gibt einen Speicherbereich frei, auf dessen Anfang ptr zeigt. Der Inhalt von ptr muß der Return-Wert einer der Funktionen malloc(), calloc() oder realloc() sein, durch die zuvor der Speicherbereich reserviert wurde. Falls ptr ein NULL-Zeiger ist, hat dieses keine weitere Auswirkungen. Querverweis Beispiel : : calloc malloc realloc s.u. UNIX : Solaris 2.x : wie oben SunOS 4.1.x : int free(char *ptr); Rückgabe: 1 bei Erfolg, 0 bei Fehler Beispiel zur Funktion free() #include <string.h> #include <stdio.h> #include <alloc.h> int main(void) { char *str; /* reserviert Speicher fuer einen String */ str = malloc(10); /* kopiert "Hallo" in den String */ strcpy(str, "Hallo"); /* zeigt den String an */ printf("Der String lautet %s\n", str); /* gibt Speicher frei */ free(str); return 0; } 4.50. FREOPEN() 4.50 111 freopen() Name : freopen — wechselt die Datei. Benutzung : FILE *freopen(const char *name, const char *modus, FILE *fp); Prototyp in : <stdio.h> (ANSI) Beschreibung : freopen() (file reopen) schließt die mit dem File-Pointer fp verbundene Datei und eröffnet die Datei name mit der Zugriffsart modus unter Verwendung des alten File-Pointers fp. Die möglichen Zugriffsarten sind bei fopen() beschrieben. freopen wird meistens zur Umlenkung der Ein-/Ausgabe Standardateien stdin, stdout, stderr, stdaux oder stdprn eingesetzt. Return-Wert: : Die Funktion gibt den File-Pointer der neu geöffneten Datei zurück, der identisch mit dem Wert von fp ist. Im Fehlerfall wird der NULL-Zeiger zurückgegeben. Die ursprüngliche Datei wird immer geschlossen. Querverweis : fclose fopen open Beispiel : s.u. UNIX : Solaris 2.x / SunOS 4.1.x : wie oben Beispiel zur Funktion freopen() #include <stdio.h> int main(void) { /* leitet die Standardausgabe in eine Datei um */ if (freopen("OUTPUT.FIL", "w", stdout)== NULL) fprintf(stderr, "Fehler beim Versuch, " "stdout umzuleiten!\n"); /* dies wird in OUTPUT.FIL umgeleitet */ printf("Das steht in der Datei."); /* schliesst die (umgeleitete) Standardausgabe */ fclose(stdout); return 0; } 112 KAPITEL 4. FUNKTIONEN 4.51 frexp() Name : frexp — berechnet die Mantisse und den Exponenten einer Gleitkommazahl. (ANSI) Benutzung : double frexp(double x, int *exponent); Prototyp in : <math.h> Beschreibung : frexp() (float remnant exponent) zerlegt die Gleitpunktzahl x in eine Mantisse m und einen Exponenten exp zur Basis 2, nach folgender Gleichung: • x = m ∗ 2exp (0.5 ≤ m < 1) Der Exponent exp wird an der durch ptr adressierten Speicherstelle abgelegt. Falls x den Wert 0 hat, erhalten m und exp den Wert 0. Aus der Mantisse m und den Exponenten exp kann der Wert x mithilfe der Funktion ldexp() berechnet werden. Return-Wert: : Die Funktion gibt den Wert der Mantisse m zurück. Querverweis Beispiel UNIX exp, ldexp s.u. Solaris 2.x / SunOS 4.1.x : wie oben : : : Beispiel zur Funktion frexp() #include <math.h> #include <stdio.h> int main(void) { double mantisse, zahl = 7.99999999; int exponent; mantisse = frexp(zahl, &exponent); printf("%lf ist %lf mal 2 hoch %d\n",zahl, mantisse, exponent); return 0; } 4.52. FSCANF() 4.52 113 fscanf() Name : fscanf — liest formatiert aus einer Datei. Benutzung : int fscanf(FILE *fp, const char *formatstring, arg1, arg2, . . . ); Prototyp in : <stdio.h> (ANSI) Beschreibung : fscanf() (file scan formatted) liest Daten aus der mit dem File-Pointer fp verbundene Datei. Entsprechend dem Format-String formatstring erfolgt die Zuordnung zu den entsprechenden Argumenten arg1, arg, . . . . Der Format-String wird in der bei scanf() beschriebenen Weise gebildet. Jedes der Argumente arg1, arg2, . . . ist ein Zeiger auf eine Variable, deren Typ mit der entsprechenden Typangabe im Format-String übereinstimmen muß. Return-Wert: : Die Funktion liefert die tatsächliche Anzahl der eingelesenen Datenfelder zurück. Bei Erreichen des Dateiendes wird EOF zurückgegeben. Querverweis Beispiel UNIX atof, fprintf printf scanf sscanf s.u. Solaris 2.x / SunOS 4.1.x : wie oben : : : Beispiel zur Funktion fscanf() #include <stdlib.h> #include <stdio.h> int main(void) { int i; printf("Geben Sie eine ganze Zahl ein: "); /* liest einen Integer-Wert aus der Standard-Eingabedatei */ if (fscanf(stdin, "%d", &i)) printf("Dieser Integer-Wert wurde gelesen: %i\n", i); else { fprintf(stderr, "Fehler beim Lesen eines Integer-Wertes von stdin.\n"); exit(1); } return 0; } 114 4.53 KAPITEL 4. FUNKTIONEN fseek() Name : fseek — verschiebt den Dateizeiger in einer Datei. Benutzung : int fseek(FILE *fp, long offset, int basis); Prototyp in : <stdio.h> Beschreibung : (ANSI) fseek() (file seek) verschiebt den Seek-Zeiger (Dateizeiger) der mit dem File-Pointer fp verbundene Datei um offset Bytes. Die Variable basis kann dabei folgende Werte beinhalten: basis 0 1 2 Anmerkung vom Dateianfang von der aktuellen Position vom Dateiende Return-Wert: : Die Funktion liefert die tatsächliche Anzahl der eingelesenen Datenfelder zurück. Bei Erreichen des Dateiendes wird EOF zurückgegeben. Querverweis : Beispiel : fgetpos fopen fsetpos ftell lseek rewind tell s.u. UNIX : Solaris 2.x / SunOS 4.1.x : wie oben (offset vom Typ integer) 4.53. FSEEK() Beispiel zur Funktion fseek() #include <stdio.h> long filesize(FILE *stream); int main(void) { FILE *stream; /* oeffnet eine Datei zum Aktualisieren fuer lesenden und schreibenden Zugriff */ stream = fopen("MYFILE.TXT", "a+"); /* schreibt einige Daten in die Datei */ fprintf(stream, "Das ist ein Test!\n"); /* gibt die aktuelle Groesse der Datei aus */ printf("MYFILE.TXT ist %ld Bytes gross\n", filesize(stream)); return 0; } long filesize(FILE *stream) { long altpos, laenge; /* speichert die aktuelle Position des Dateizeigers */ altpos = ftell(stream); /* positioniert ans Ende der Datei */ fseek(stream, 0L, SEEK_END); /* speichert die Groesse der Datei */ laenge = ftell(stream); /* setzt den Dateizeiger auf die urspruengliche Position */ fseek(stream, altpos, SEEK_SET); return laenge; } 115 116 4.54 KAPITEL 4. FUNKTIONEN fsetpos() Name : fsetpos — positioniert den Dateizeiger in einer Datei. Benutzung : int fsetpos(FILE *fp, const fpos t *ppos); Prototyp in : <stdio.h> (ANSI) Beschreibung : fsetpos() (file set postion) setzt den Seek-Zeiger (Dateizeiger) der mit dem File-Pointer fp verbundenen Datei an die neue Position *ppos. Die gewünschte Position kann zuvor mit fgetpos() ermittelt werden. Der Datentyp fpos t ist in stdio.h als long definiert. Der Aufruf von fsetpos(fp, ppos) ist wirkungsgleich mit fseek(fp, *ppos, 0). Return-Wert: : Die Funktion liefert bei erfolgreicher Durchführung den Wert 0 zurück. Im Fehlerfall wird ein von 0 verschiedener Wert zurückgegeben und die Fehlervariable errno erhält den Wert EINVAL (= invalid argument) oder EBADF (= bad file number). Querverweis Beispiel : : fgetpos fseek ftell s.u. UNIX : Solaris 2.x : wie oben SunOS 4.1.x : nicht vorhanden 4.54. FSETPOS() Beispiel zur Funktion fsetpos() #include <stdlib.h> #include <stdio.h> void showpos(FILE *stream); int main(void) { FILE *stream; fpos_t filepos; /* oeffnet eine Datei fuer lesenden und schreibenden Zugriff */ stream = fopen("DUMMY.FIL", "w+"); /* speichert die Position des Dateizeigers */ fgetpos(stream, &filepos); /* schreibt einige Daten in die Datei */ fprintf(stream, "Das ist ein Test!\n"); /* zeigt die aktuelle Position des Dateizeigers */ showpos(stream); /* setzt eine neue Position und zeigt sie an */ if (fsetpos(stream, &filepos) == 0) showpos(stream); else { fprintf(stderr, "Fehler beim Setzen " "des Dateizeigers.\n"); exit(1); } /* schliesst die Datei */ fclose(stream); return 0; } void showpos(FILE *stream) { fpos_t pos; /* zeigt die aktuelle Position des Dateizeigers eines Streams */ fgetpos(stream, &pos); printf("Position des Dateizeigers: %ld\n", pos); } 117 118 KAPITEL 4. FUNKTIONEN 4.55 ftell() Name : ftell — ermittelt den aktuellen Dateizeiger. Benutzung : long ftell(FILE *fp); Prototyp in : <stdio.h> (ANSI) Beschreibung : ftell() (file tell) ermittelt die aktuelle Position des Dateizeigers der mit dem File-Pointer fp verbundene Datei. Die Position wird als long-Funktionswert zurückgegeben und gibt den Abstand zum Dateianfang in Bytes an. Return-Wert: : Die Funktion liefert die aktuelle Position (= Wert des Dateizeigers) zurück. Bei falschem File-Pointer wird der Wert -1L zurückgeliefert, und die Fehlervariable errno wird auf EBADF (= bad file number) oder EINVAL (= ivalid argument) gesetzt. Querverweis : fgetpos fseek fsetpos lseek rewind tell Beispiel : s.u. UNIX : Solaris 2.x / SunOS 4.1.x : wie oben Beispiel zur Funktion ftell() #include <stdio.h> int main(void) { FILE *stream; /* oeffnet eine Datei fuer lesenden und schreibenden Zugriff */ stream = fopen("MYFILE.TXT", "w+"); /* schreibt einige Daten in die Datei */ fprintf(stream, "Das ist ein Test!\n"); /* ermittelt die Position des Dateizeigers und gibt sie aus */ printf("Der Dateizeiger zeigt auf das %ld. Byte\n", ftell(stream)); return 0; } 4.56. FWRITE() 4.56 119 fwrite() Name : fwrite — schreibt Daten in eine Datei. Benutzung : size t fwrite(void *buffer,size t size, size t n, FILE *fp); Prototyp in : <stdio.h> (ANSI) Beschreibung : fwrite() (file write) schreibt n- Datenobjekte der Größe size aus dem durch buffer adressierten Puffer in die Datei, die mit dem File-Pointer fp eröffnet wurde. Der Datentyp size t ist in stdio.h als unsigned int definiert. Die Gegenfunktion zu fwrite() ist fread(). Return-Wert: : Die Funktion liefert die Anzahl der Datenobjekte zurück, die tatsächlich in die Datei geschrieben wurden. Ist die Zahl kleiner als n, so ist ein Fehler aufgetreten. Querverweis : fopen fread Beispiel : s.u. UNIX : Solaris 2.x / SunOS 4.1.x : wie oben 120 KAPITEL 4. FUNKTIONEN Beispiel zur Funktion fwrite() #include <stdio.h> struct mystruct { int i; char ch; }; int main(void) { FILE *stream; struct mystruct s; /* oeffnet die Datei TEST.$$$ */ if ((stream = fopen("TEST.$$$", "wb"))== NULL) { fprintf(stderr, "Kann Ausgabedatei nicht oeffnen.\n"); return 1; } s.i = 0; s.ch = ’A’; /* schreibt struct s in Datei */ fwrite(&s, sizeof(s), 1, stream); /* schliesst Datei */ fclose(stream); return 0; } 4.57. GENINTERRUPT() 4.57 geninterrupt() Name : geninterrupt — erzeugt einen Software- Interrupt. Benutzung : void geninterrupt(int intr num); Prototyp in : <dos.h> Beschreibung : geninterrupt() (geninterrupt) löst einen Software-Interrupt für den Interrupt intr num aus. Hinweis : Interrupts können Register, die von C verwendet werden, in einem nicht vorhersehbaren Zustand zurücklassen. Return-Wert: : Keiner Querverweis : bdos disable enable getvect int86 int86x intr Beispiel : geninterrupt(0); /* Intr. für Divisionsfehler */ Ergebnis UNIX : : Divide error nicht vorhanden 121 122 KAPITEL 4. FUNKTIONEN Beispiel zur Funktion geninterrupt() #include <conio.h> #include <dos.h> void writechar(char ch); int main(void) { clrscr(); gotoxy(80,25); /* schreibt ein Zeichen in die rechte untere Ecke, ohne anschliessend den Bildschirm zu scrollen */ writechar(’*’); /* wartet auf einen Tastendruck */ getch(); return 0; } /* die Funktion writechar gibt an der aktuellen Cursorposition ein Zeichen aus und vermeidet durch die Verwendung des Video-BIOS, dass der Bildschirm nach oben scrollt, wenn an die Stelle (80,25) geschrieben wird. */ void writechar(char ch) { struct text_info ti; /* ermittelt die aktuellen Texteinstellungen */ gettextinfo(&ti); /* Interrupt 0x10 Subfunktion 9 */ _AH = 9; /* auszugebendes Zeichen */ _AL = ch; _BH = 0; /* Bildschirmseite */ _BL = ti.attribute; /* Textattribut */ _CX = 1; /* Wiederholungsfaktor */ /* gibt das Zeichen aus */ geninterrupt(0x10); } 4.58. GETC(), GETCHAR() 4.58 123 getc(), getchar() Name : getc, getchar — liest ein Zeichen aus Datei. Benutzung : int getc(FILE *fp); int getchar(void); Prototyp in : <stdio.h> (ANSI) Beschreibung : getc() (get character) liest ein Zeichen aus der mit dem File-Pointer fp verbundenen Datei. Das Makro getchar() ist wirkungsgleich mit getc(stdin), welches das nächste Zeichen von Standardeingabe liest. Das Makro getc() ist wirkungsgleich mit fegtc(). Die entsprechenden Makros für die Ausgabe sind putc() und putchar(). Return-Wert: : Die Funktion liefert das eingelesene Zeichen zurück. Der Return-Wert EOF zeigt einen Fehler oder das Dateiende an. Querverweis : fgetc getch getchar getche gets puts putchar Beispiel : s.u. UNIX : Solaris 2.x / SunOS 4.1.x : wie oben Beispiel zur Funktion getc() #include <stdio.h> int main(void) { char ch; printf("Geben Sie ein Zeichen ein: "); /* liest ein Zeichen von der Standardeingabe */ ch = getc(stdin); printf("Dies ist das eingegebene Zeichen: ’%c’\n", ch); return 0; } 124 KAPITEL 4. FUNKTIONEN 4.59 getcbrk() Name : getcbrk — ermittelt Ctrl-Break-Flag. Benutzung : int getcbrk(void); Prototyp in : <stdio.h> Beschreibung : getcbrk() (get control break) verwendet den DOS-Systemaufruf 0x33, um zu ermitteln, wann DOS auf Ctrl-Break prüft. Return-Wert: : Die Funktion liefert den Wert 0 zurück, wenn die Überprüfung abgeschaltet ist, sont den Wert 1. Querverweis : ctrlbrk setcbrk Beispiel : s.u. UNIX : nicht vorhanden Beispiel zur Funktion getcbrk() #include <stdio.h> #include <dos.h> int main(void) { if (getcbrk()) printf("Ctrl-Break ist " "eingeschaltet.\n"); else printf("Ctrl-Break ist " "ausgeschaltet \n"); return 0; } 4.60. GETCH(), GETCHE() 4.60 getch(), getche() Name : getch, getche — liest ein Zeichen von Tastatur. Benutzung : int getch(void); int getche(void); Prototyp in : <stdio.h> Beschreibung : getch() und getche() (get character) lesen ein Zeichen direkt von der Tastatur. getch() gibt das Zeichen nicht auf dem Bildschirm aus. getche() gibt das Zeichen auf dem Bildschirm aus. Das Zeichen Ctrl-Z wird nicht als Dateiende interpretiert. Die Eingabe von Ctrl-C löst den Interrupt 0x23 (= Break) aus (DOS). Mit ungetc() kann das zuletzt gelesene Zeichen zurückgestellt werden. Return-Wert: : Die Funktionen liefern den ASC-Wert des eingelesenen Zeichens zurück. Es gibt keinen speziellen Return-Wert für das Dateiende oder für den Fehlerfall. Querverweis : cgets cscanf fgetc getc getchar getche getpass kbhit putch ungetch Beispiel : s.u. UNIX : Solaris 2.x / SunOS 4.1.x : Headerdatei ist <curses.h>; getche() nicht vorhanden; Sonderfunktion “Ctrl - d“. 125 126 KAPITEL 4. FUNKTIONEN Beispiel zur Funktion getch() #include <conio.h> #include <stdio.h> int main(void) { int c; int extended = 0; printf("Druecken Sie eine Taste!\n"); c = getch(); if (!c) extended = getch(); if (extended) printf("Erweiterter IBM-Code: %d\n", extended); else printf("ASCII-Code Nr.: %d\n", c); getch(); return 0; } 4.61. GETCURDIR() 4.61 127 getcurdir() Name : getcurdir — ermittelt das aktuelle Verzeichnis eines Laufwerkes. Benutzung : int getcurdir(int laufwerk, char *directory); Prototyp in : <dir.h> Beschreibung : getcurdir() (get current directory) ermittelt das aktuelle Verzeichnis für das angegebene Laufwerk. directory zeigt auf die Zeichenkette mit der Länge MAXDIR, welche den Verzeichnisnamen mit einem \0 enthält. Die Laufwerksbezeichnung ist nicht enthalten, ebenso fehlt das Zeichen \ am Anfang. laufwerk 0 1 2 ... Bedeutung für das aktuelle Laufwerk für das Laufwerk A für das Laufwerk B usw. Return-Wert: : Die Funktion liefert bei fehlerfreier Durchführung den Wert 0, sonst -1. Querverweis : chdir getcwd getdisk mkdir rmdir Beispiel : s.u. UNIX : 128 KAPITEL 4. FUNKTIONEN Beispiel zur Funktion getcurdir() #include <dir.h> #include <stdio.h> #include <string.h> char *current_directory(char *path) { /* Fllt den String mit X:\ */ strcpy(path, "X:\\"); /* ersetzt das X durch den Buchstaben des aktuellen Laufwerks */ path[0] = ’A’ + getdisk(); /* fuellt den Rest des Strings mit dem aktuellen Directory */ getcurdir(0, path+3); return(path); } int main(void) { char curdir[MAXPATH]; current_directory(curdir); printf("Das aktuelle Directory ist %s\n", curdir); return 0; } 4.62. GETCWD() 4.62 129 getcwd() Name : getcwd — ermittelt das aktuelle Arbeitsverzeichnis eines Laufwerkes. Benutzung : char *getcwd(char *buf, int buflen); Prototyp in : <dir.h> Beschreibung : getcwd() (get current working directory) ermittelt das aktuelle Arbeitsverzeichnis mit Laufwerksangabe bezüglich der Größe buflen. Ist der vollständige Pfadname länger (einschließlich des 0-Zeichens) als buflen-Bytes, wird ein Fehler erzeugt. Return-Wert: : Die Funktion liefert folgende Werte zurück: • Ist buf bei der Eingabe ungleich NULL, wird bei fehlerfreier Ausführung buf, im Fehlerfall NULL zurückgegeben. • Ist buf bei der Eingabe gleich NULL, wird bei fehlerfreier Ausführung einen Zeiger auf den belegten String zurückgegeben. Im Fehlerfall wird errno auf einen der folgenden Werte gesetzt Wert ENODEV ENOMEM ERANGE Bedeutung Gerät nicht bereit/nicht vorhanden nicht genug Platz im Hauptspeicher Ergebnis außerhalb des Bereichs Querverweis : chdir getcurdir mkdir rmdir Beispiel : s.u. UNIX : Solaris 2.x / SunOS 4.1.x : Headerdatei ist <unistd.h>, sonst wie oben 130 KAPITEL 4. FUNKTIONEN Beispiel zur Funktion getcwd() #include <stdio.h> #include <dir.h> #include <conio.h> int main(void) { char buffer[MAXPATH]; /* ermittelt das aktuelle Directory#include <dir.h> #include <conio.h> und zeigt es an */ getcwd(buffer, MAXPATH); printf("Das aktuelle Directory ist: %s\n", buffer); getch(); return 0; } 4.63. GETDATE() 4.63 getdate() Name : getdate — ermittelt das aktuelle Datum. Benutzung : void getdate(struct date *datum); Prototyp in : <dos.h> Beschreibung : getdate() (get datum) ermittelt das aktuelle Datum und kopiert die Werte in die dafür vorgesehene Struktur. Der Strukturtyp date ist in dos.h wie folgt definiert: struct date { int da year; /* aktuelles Jahr */ char da day; /* Tag im Monat (1-31 */ char da mon; /* Monat (1-12) */ }; Return-Wert: : Keiner Querverweis : ctime gettime setdate settime Beispiel : s.u. UNIX : Solaris 2.x : getdate() vorhanden, aber mit anderer Funktion SunOS 4.1.x : nicht vorhanden Beispiel zur Funktion getdate() #include <dos.h> #include <stdio.h> int main(void) { struct date d; getdate(&d); printf("Tag: %d\n" "Monat: %d\n" "Jahr: %d\n", d.da_day, d.da_mon, d.da_year); return 0; } 131 132 4.64 KAPITEL 4. FUNKTIONEN getdfree() Name : getdfree — ermittelt den freien Platz auf einer Diskette/Festplatte. Benutzung : void getdfree(unsigned char laufwerk, struct dfree *dtable); Prototyp in : <dos.h> Beschreibung : getdfree() (get disk free space) ermittelt den freien Platz auf dem durch laufwerk angegebenen Laufwerks. Für laufwerk können folgende Werte gesetzt werden: laufwerk 0 1 2 ... Bedeutung für das aktuelle Laufwerk für das Laufwerk A für das Laufwerk B usw. Der Strukturtyp dfree ist wie folgt definiert: struct dfree { unsigned df avail; /* freie Cluster */ unsigned df total; /* Gesamtzahl Cluster */ unsigned df bsec; /* Byte pro Sektor */ unsigned df sclus; /* Sektoren pro Cluster */ }; Return-Wert: : Keiner Im Fehlerfall wird df sclus der Wert 0xFFFF zugewiesen. Querverweis : Beispiel : s.u. UNIX : Solaris 2.x / SunOS 4.1.x : nicht vorhanden 4.64. GETDFREE() Beispiel zur Funktion getdfree() #include #include #include #include <stdio.h> <stdlib.h> <dir.h> <dos.h> int main(void) { struct dfree free; long avail; int drive; drive = getdisk(); getdfree(drive+1, &free); if (free.df_sclus == 0xFFFF) { printf("Fehler beim Aufruf von " "getdfree()\n"); exit(1); } avail = (long) free.df_avail * (long) free.df_bsec * (long) free.df_sclus; printf("In Laufwerk %c: sind noch %ld " "Bytes frei\n", ’A’+drive, avail); return 0; } 133 134 KAPITEL 4. FUNKTIONEN 4.65 getdisk() Name : getdisk — ermittelt das aktuelle Laufwerk. Benutzung : int getdisk(void); Prototyp in : <dir.h> Beschreibung : getdisk() (getdisk) ermittelt das aktuelle Laufwerk. Return-Wert: : Die Funktion liefert die Nummer des aktuellen Laufwerkes zurück. laufwerk 0 1 2 ... Bedeutung für das aktuelle Laufwerk für das Laufwerk A für das Laufwerk B usw. Querverweis : getcurdir setdisk Beispiel : s.u. UNIX : Solaris 2.x / SunOS 4.1.x : nicht vorhanden Beispiel zur Funktion getdisk() #include <stdio.h> #include <dir.h> int main(void) { int disk; disk = getdisk() + ’A’; printf("Das aktuelle Laufwerk ist %c.\n", disk); return 0; } 4.66. GETENV() 4.66 135 getenv() Name : getenv — gibt Information zu einer Umgebungsvariablen aus. (ANSI) Benutzung : char *getenv(const char *name); Prototyp in : <stdlib.h> Beschreibung : getenv() (get enviroment) sucht die Tabelle der Umgebungsvariablen nach dem zu name gehörenden Eintrag ab. Return-Wert: : Die Funktion liefert einen Zeiger auf den entsprechenden Eintrag zurück. Falls kein Eintrag zu name vorhanden ist, wird der Wert NULL zurückgegeben. (= Wert des Dateizeigers) zurück. Querverweis : environ (globale Variable) getpsp putenv Beispiel : s.u. UNIX : Solaris 2.x / SunOS 4.1.x : wie oben Beispiel zur Funktion getenv() #include <stdlib.h> #include <stdio.h> int main(void) { char *s; /* die Comspec Environment-Parameter lesen */ s=getenv("COMSPEC"); /* die Parameter zeigen */ printf("Command processor: %s\n",s); return 0; } 136 KAPITEL 4. FUNKTIONEN 4.67 gets() Name : gets — liest eine Zeichenkette von Tastatur. Benutzung : char *gets(char *buffer); Prototyp in : <stdio.h> (ANSI) Beschreibung : gets() (get string) liest eine Zeichenkette von der Tastatur bis zum Newline-Zeichen \n und legt sie in dem durch buffer spezifizierten Bereich ab. Das Newline-Zeichen wird durch das String-Endezeichen \0 ersetzt. Die Gegenfunktion ist puts(). Return-Wert: : Die Funktion liefert bei fehlerfreier Ausführung einen Zeiger auf buffer zurück. Im Fehlerfall wird NULL zurückgegeben. Querverweis : cgets ferror fgets fputs fread getc puts Beispiel : s.u. UNIX : Solaris 2.x / SunOS 4.1.x : wie oben Beispiel zur Funktion gets() #include <stdio.h> int main(void) { char string[80]; printf("Geben Sie einen String ein: "); gets(string); printf("Dies ist der eingegebene String: " "%s\n", string); return 0; } 4.68. GETTIME() 4.68 gettime() Name : gettime — ermittelt die Uhrzeit des Systems. Benutzung : void gettime(struct time *timep); Prototyp in : <dos.h> Beschreibung : gettime() (gettime) ermittelt die aktuelle Zeit unter MS-DOS und setzt die Werte in die dafür vorgegebene Struktur. struct time { unsigned char ti min; /* Minuten */ unsigned char ti hour; /* Stunden */ unsigned char ti hund; /* 1/100 Sek. */ unsigned char ti sec; /* Sekunden */ }; Return-Wert: : Keiner Querverweis : getdate settime time Beispiel : s.u. UNIX : Solaris 2.x: int clock gettime(clockid t clock id, struct timespec *tp) setzt die Zeit für die durch clock id spezifizierte Uhr mit Headerdatei <time.h> SunOS 4.1.x : nicht vorhanden : Beispiel zur Funktion gettime() #include #include <stdio.h> <dos.h> int main(void) { struct time t; gettime(&t); printf("Es ist jetzt %2d Uhr %02d Minuten " "und %02d.%02d Sekunden.\n", t.ti_hour, t.ti_min, t.ti_sec, t.ti_hund); return 0; } 137 138 4.69 KAPITEL 4. FUNKTIONEN getvect() Name : getvect — liest einen Interrupt-Vektor. Benutzung : void interrupt(*getvect(int intr nummer))(); Prototyp in : <dos.h> Beschreibung : MS-DOS besitzt eine Vektortabelle für Hardware-Interrupts, die von 0 bis 255 durchnummeriert sind. Der Wert in jedem Vektor, der eine Länge von 4 byte hat, ist die Adresse der jeweiligen Interrupt-Funktion. getvect liest den Wert des Vektors, der durch intr nummer lokalisiert wird, interpretiert diesen gelesenen Wert als einen Zeiger, der auf die Interrupt-Routine zeigt. Return-Wert: : getvect liefert den aktuellen 4 Byte langen Wert zurück, der im Interrupt-Vektor intr nummer gespeichert ist. Querverweis : disable enable Beispiel : s.u. UNIX : Solaris 2.x / SunOS 4.1.x : nicht vorhanden 4.69. GETVECT() Beispiel zur Funktion getvect() #include <stdio.h> #include <dos.h> void interrupt get_out(); /* Interruptprototyp */ void interrupt (*oldfunc)(); /* Interruptfunktionszeiger */ int looping = 1; int main(void) { puts("Mit <Shift><Prt Sc> beenden"); /* speichert alten Interrupt */ oldfunc = getvect(5); /* installiert Interrupthandler */ setvect(5,get_out); /* nichts tun */ while (looping); /* setzt urspruengliche Interruptroutine */ setvect(5,oldfunc); puts("Die Operation war erfolgreich."); return 0; } void interrupt get_out() { looping = 0; /* veraendert die globale Variable, um die Schleife zu verlassen */ } 139 140 4.70 KAPITEL 4. FUNKTIONEN gmtime() Name : gmtime — rechnet Datum und Uhrzeit in die Greenwich Mean Time (GMT) um. (ANSI) Benutzung : struct tm *gmtime(const time t *sec); Prototyp in : <time.h> Beschreibung : gmtime() (Greenwich Mean Time (GMT)) wandelt die in sec angegebene Anzahl von Sekunden, die seit dem 1. Januar 1970, 0 Uhr vergangen sind, in das entsprechende Datum mit Uhrzeit um. Die aktuelle Anzahl der Sekunden erhält man durch einen Aufruf der Funktion time(). Der Datentyp time t ist in time.h als long definiert. gmtime() erzeugt eine Struktur tm und legt die Werte dort ab und ist wie folgt definiert: struct tm { int tm int tm int tm int tm int tm int tm int tm int tm int tm sec; min; hour; mday; mon; year; wday; yday; isdst; }; Die Tageszeit wird in 24 Stunden gemessen, der Tag im Monat von 1 bis 31, der Monat von 0 bis 11 und der Tag Jahr von 0 bis 365. Der Wochentag beginnt mit Sonntag = 0 und zur Jahresangabe muß 1900 addiert werden. Das Flag tm isdst gibt an, ob die Sommerzeit konvertierung durchgeführt wurde. Return-Wert: : Die Funktion liefert einen Zeiger auf die Struktur vom Typ tm. Querverweis : asctime ctime ftime localtime stime time tzset Beispiel : time t sec; time(&sec); printf(”Datum und Uhrzeit(GMT): %s \n“, asctime(gmtime(&sec))); Ergebnis : Datum und Uhrzeit (GMT): Sun Oct 16 18:46:04 1990 4.70. GMTIME() UNIX : Solaris 2.x / SunOS 4.1.x : wie oben Beispiel zur Funktion gmtime() #include #include #include #include <stdio.h> <stdlib.h> <time.h> <dos.h> /* Mitteleuropaeische Zeit & Sommerzeit */ char *tzstr = "TZ=MEZ-1MES"; int main(void) { time_t t; struct tm *gmt, *area; /* schreibt den time zone-String in die Environment-Tabelle */ putenv(tzstr); tzset(); t = time(NULL); area = localtime(&t); printf("Ortszeit: %s", asctime(area)); gmt = gmtime(&t); printf("Greenwich: %s", asctime(gmt)); return 0; } 141 142 4.71 KAPITEL 4. FUNKTIONEN harderr() Name : harderr — installiert einen Hardware- Error-Handler. Benutzung : void harderr(int (*handler)()); Prototyp in : <dos.h> Beschreibung : harderr() (harderr) installiert für das aktuelle Programm eine Fehlerbehandlungsroutine. Diese Routine wird bei jedem Auftreten eines Interrupt 0x24 aufgerufen. Es wird dabei die Funktion, auf die handler zeigt, aufgerufen. Diese wird wie folgt aufgerufen: handler(int errval, int ax, int bp, int si); errval : ist der von DOS übergebene Fehlercode. ax, bp, si : enthalten die Registerwerte AX, BP, SI. ax hat folgende Bedeutung: • ax ≥ 0 = Diskettenfehler Mit der Operation ax & 0x00FF erhält man die Nummer des Laufwerks: laufwerk 1 2 3 ... Bedeutung für das Laufwerk A für das Laufwerk B für das Laufwerk C usw. • ax < 0 = Gerätefehler bp und si zeigen zusammen auf den Header des Gerätetreibers, in dem der Fehler aufgetreten ist. bp enthält die Segmentadresse, si ist der Offset. Die Funktion, auf die handler zeigt wird nicht direkt aufgerufen. harderr installiert einen DOS-Interrupt-Vektor, der diese Funktion aufruft. Rückgabewerte von handler : • 0 für Ignorieren • 1 für Wiederholen • 2 für Abbruch Return-Wert: : Keiner Querverweis : hardresume hardretn Beispiel : s.u. 4.71. HARDERR() UNIX : 143 Solaris 2.x / SunOS 4.1.x : nicht vorhanden Beispiel zur Funktion harderr() /* Dieses Programm faengt Diskettenfehler fordert den Benutzer zu einer Aktion Lassen Sie das Programm laufen, ohne Diskette in Laufwerk A: eingelegt zu */ ab und auf. eine haben. #include <stdio.h> #include <conio.h> #include <dos.h> #define IGNORE #define RETRY #define ABORT 0 1 2 int buf[500]; /* definiert Fehlermeldungen, die Diskettenprobleme beschreiben / * static char *err_msg[] = { "Diskette ist schreibgeschuetzt", "unbekannte Einheit", "Laufwerk nicht bereit", "unbekanntes Kommando", "Datenfehler (CRC)", "falsche Laenge (Request-Struktur)", "Suchfehler", "unbekannter Mediumstyp", "Sektor nicht gefunden", "Drucker hat kein Papier", "Schreibfehler", "Lesefehler", "allgemeiner Fehler", "unbekannter Fehler", "unbekannter Fehler", "ungueltiger Diskettenwechsel" }; error_win(char *msg) { int retval; cputs(msg); /* fordert den Anwender auf, eine Taste 144 KAPITEL 4. FUNKTIONEN zu druecken, um abzubrechen, zu wiederholen oder zu ignorieren */ while(1) { retval= getch(); if (retval == ’a’ || retval == ’A’) { retval = ABORT; break; } if (retval == ’w’ || retval == ’W’) { retval = RETRY; break; } if (retval == ’i’ || retval == ’I’) { retval = IGNORE; break; } } return(retval); } /* Das Pragma warn -par unterdrueckt die Warnungen des Compilers, die sich auf die Nichtbenutzung der Parameter errval, bp und si von handler beziehen. / * #pragma warn -par int handler(int errval,int ax,int bp,int si) { static char msg[200]; unsigned di; int drive; int errorno; di= _DI; /* falls es sich nicht um einen Diskettenfehler handelt, gibt es Probleme mit einer anderen logischen Geraeteeinheit */ if (ax < 0) { /* meldet den Fehler */ error_win("Geraetefehler"); 4.71. HARDERR() /* zurueck zum Programm, das sofort abgebrochen werden soll */ hardretn(ABORT); } /* es war ein Diskettenfehler */ drive = ax & 0x00FF; errorno = di & 0x00FF; /* meldet, um welchen Fehler es sich handelt */ sprintf(msg, "Fehler bei Laufwerk %c: %s!\r\n" "A)bbrechen, W)iederholen, " "I)gnorieren ?\r\n", ’A’ + drive, err_msg[errorno]); /* zurueck zum Programm mit Hilfe von DOS-Interrupt 0x23, mit Abbrechen, Wiederholen oder Ignorieren als Eingabe vom Benutzer */ hardresume(error_win(msg)); return ABORT; } #pragma warn +par int main(void) { /* installiert unsere Routine zur Behandlung von Hardware-Problemen */ harderr(handler); clrscr(); printf("oeffnen Sie die Klappe von Laufwerk A:,\n"); "und druecken Sie eine Taste...\n"); getch(); printf("Versuche auf Laufwerk A: " "zuzugreifen...\n"); printf("fopen liefert %p\n", fopen("A:temp.dat", "w")); return 0; } 145 146 4.72 KAPITEL 4. FUNKTIONEN hardresume() Name : hardresume — Hardware-Fehlerbehandlungsroutine. Benutzung : void hardresume(int axret); Prototyp in : <dos.h> Beschreibung : hardresume() (hardresume) kann von der in harderr vereinbarten Fehlerbehandlungsroutine aufgerufen werden, um zu DOS zurückzukehren. Folgende Argumente sind möglich: axret 0 1 2 Bedeutung für Ignorieren für Wiederholen für Abbruch Der Abbruch wird über einen Aufruf des DOS-Interrupts 0x23 (CtrlBreak) durchgeführt. Return-Wert: : Keiner Querverweis : harderr hardretn Beispiel : s.u. UNIX : Solaris 2.x / SunOS 4.1.x : nicht vorhanden Beispiel zur Funktion hardresume() #include <stdio.h> #include <conio.h> #include <dos.h> #define IGNORE #define RETRY #define ABORT 0 1 2 int buf[500]; /* define the error messages for trapping disk problems */ static char *err_msg[] = { "schreibgeschuetzt", "unbekanntes Medium", 4.72. HARDRESUME() 147 "Diskette/Laufwerk nicht bereit", "unbekannter Befehl", "Datenfehler (CRC)", "ungueltiger Aufruf", "Suchfehler", "unbekannter Platten/Diskettentyp", "Sektor nicht gefunden", "Papier fehlt", "Schreibfehler", "Lesefehler", "Allgemeine Fehlerbedingung", "reserviert", "reserviert", "Diskettenwechsel unzulaessig" }; error_win(char *msg) { int retval; cputs(msg); /* Eingabeaufforderung an Benutzer, ob abbrechen, wiederholen oder ignorieren */ while(1) { retval= getch(); if (retval == ’a’ || retval == ’A’) { retval = ABORT; break; } if (retval == ’w’ || retval == ’W’) { if (retval == ’i’ || retval == ’I’) { } retval = RETRY; retval = IGNORE; break; break; return(retval); } /* pragma warn -par reduziert die Warnungen, die aufgrund des */ /* fehlenden Parameter errval, bp und si auftauchen koennen und */ /* gibt "Parameter never used" aus */ #pragma warn -par int handler(int errval,int ax,int bp,int si) { static char msg[80]; unsigned di; int drive; int errorno; } } 148 KAPITEL 4. FUNKTIONEN di= _DI; /* falls es sich nicht um einen Diskettenfehler gehandelt hat, */ /* wurde das Problem von einer anderen Geraeteeinheit verursacht. */ /* /* /* /* if (ax < 0) { /* meldet den Fehler */ error_win("Fehler an Geraeteeinheit"); /* und gibt direkt an das Programm zurueck mit der */ /* Aufforderung abzubrechen */ hardretn(ABORT); } anderenfalls handelt es sich um einen Disketten/Laufwerksfehler */ drive = ax & 0x00FF; errorno = di & 0x00FF; meldet den Fehler */ sprintf(msg, "Fehler: %s Laufwerk %c\r\nA)bbrechen, W)iederholen, I)gnorieren: ", err_msg[errorno], ’A’ + drive); uebergabe an das Programm ueber den DOS-Interrupt 0x23 mit der Benutzer- */ eingabe Abbrechen, Wiederholen oder Ignorieren. */ hardresume(error_win(msg)); return ABORT; } #pragma warn +par int main(void) { /* setzt den Hardwarefehler-Interruptvektor 0x24 auf die durch handler */ /* angegebene C-Routine */ harderr(handler); clrscr(); printf("Versichern Sie sich, dass sich keine Diskette in Laufwerk A: befindet\n"); printf("Druecken Sie eine Taste ....\n"); getch(); printf("Versuch, auf Laufwerk A: zuzugreifen:\n"); printf("fopen ergibt %p\n",fopen("A:temp.dat", "w")); return 0; } 4.73. HARDRETN() 4.73 149 hardretn() Name : hardretn — Hardware-Fehlerbehandlungsroutine. Benutzung : void hardretn(int retn); Prototyp in : <dos.h> Beschreibung : Die von harderr installierte Fehlerbehandlungsroutine kann mit einem Aufruf von hardretn() direkt zum Anwenderprogramm zurückkehren. Der Rückgabewert der DOS-Funktion, die den Hardware- Fehler auslöst, ist der Wert, der an hardretn() übergeben wurde. Return-Wert: : Keiner Querverweis : harderr hardresume Beispiel : s.u. UNIX : Solaris 2.x / SunOS 4.1.x : nicht vorhanden Beispiel zur Funktion hardretn() /* Dieses Programm faengt Diskettenfehler ab und fordert den Benutzer zu einer Aktion auf. Lassen Sie das Programm laufen, ohne eine Diskette in Laufwerk A: eingelegt zu haben. / * #include <stdio.h> #include <conio.h> #include <dos.h> #define IGNORE #define RETRY #define ABORT 0 1 2 int buf[500]; /* definiert Fehlermeldungen, die Diskettenprobleme beschreiben / * static char *err_msg[] = { "Diskette ist schreibgeschuetzt", "unbekannte Einheit", 150 KAPITEL 4. FUNKTIONEN "Laufwerk nicht bereit", "unbekanntes Kommando", "Datenfehler (CRC)", "falsche Laenge (Request-Struktur)", "Suchfehler", "unbekannter Mediumstyp", "Sektor nicht gefunden", "Drucker hat kein Papier", "Schreibfehler", "Lesefehler", "allgemeiner Fehler", "unbekannter Fehler", "unbekannter Fehler", "ungueltiger Diskettenwechsel" }; void error_win(char *msg) { cputs(msg); } /* Das Pragma warn -par unterdrueckt die Warnungen des Compilers, die sich auf die Nichtbenutzung der Parameter errval, bp und si von handler beziehen. / * #pragma warn -par int handler(int errval,int ax,int bp,int si) { static char msg[200]; unsigned di; int drive; int errorno; di= _DI; /* falls es sich nicht um einen Diskettenfehler handelt, gibt es Probleme mit einer anderen logischen Geraeteeinheit */ if (ax < 0) { /* meldet den Fehler */ error_win("Geraetefehler"); /* zurueck zum Programm, das sofort abgebrochen werden soll */ hardretn(ABORT); } 4.73. HARDRETN() /* es war ein Diskettenfehler */ drive = ax & 0x00FF; errorno = di & 0x00FF; /* meldet, um welchen Fehler es sich handelt */ sprintf(msg, "Fehler bei Laufwerk %c: %s!\r\n", ’A’ + drive, err_msg[errorno]); error_win(msg); /* zurueck zum Programm mit Hilfe von DOS-Interrupt 0x23 / * hardretn(ABORT); return ABORT; } #pragma warn +par int main(void) { /* installiert unsere Routine zur Behandlung von Hardware-Problemen */ harderr(handler); clrscr(); printf("Oeffnen Sie die Klappe von Laufwerk " "A:,\und druecken Sie eine Taste...\n"); getch(); printf("Versuche auf Laufwerk A: " "zuzugreifen...\n"); printf("fopen liefert %p\n", fopen("A:temp.dat", "w")); return 0; } 151 152 4.74 KAPITEL 4. FUNKTIONEN inp(),outp() Name : inp,outp — lesen/schreiben von/auf Port-Adresse. Benutzung : int inp(unsigned port); /* Lese von Port */ void outp(unsigned port, int byte); /* Schreiben auf Port */ Prototyp in : <conio.h> /* Für Microsoft-C: Prototypen */ <dos.h> /* Für TURBO-C : Makro-Definitionen */ Beschreibung : inp() (in port) liest einzelnes Byte von durch port angegebene PortAdresse. outp() (out port) schreibt ein einzelnes Byte, den Wert von byte in die Port Adresse port. Return-Wert: : Die Funktion inp() liefert das gelesene Byte zurück. Querverweis : outp inport inportb outport outportb Beispiel : s.u. UNIX : Solaris 2.x / SunOS 4.1.x : nicht vorhanden Beispiel zur Funktion inp(),outp() int printchar( int c) /* Zeichen c an Drucker LPT1 senden */ { unsigned port = *(unsigned far *)0x00000408L; /* Port-Adresse */ /* im BIOS-Datenbereich lesen.*/ unsigned long time = 0xFFFFF; /* Wert fuer TIME-OUT */ outp(port, c & 0xFF) ++port; while( !(inp(port) & 0x80)) if (--time == 0) return 0; } /* /* /* /* Zeichen -> Daten-Port */ Status-Port */ Warten, bis Drucker bereit */ TIME OUT Fehler */ ++port; outp(port, 0xD); outp(port, 0xC); /* Steuer-Port */ /* Zeichen an Drucker schicken */ /* Bit 0 = Strobe: high, dann low. */ return 1; /* Kein Fehler */ 4.75. INT86(),INT86X() 4.75 int86(),int86x() Name : int86,int86x — Genereller 8086-Softwareinterrupt. Benutzung : int int86(int intno, union REGS *inregs, union REGS *outregs); int int86x(int intno, union REGS *inregs, union REGS *outregs, struct SREGS *segregs); Prototyp in : <dos.h> Beschreibung : int86() und int86x(),(interrupt 86) führen einen Software-Interrupt, der durch intno gegeben ist. Die Argumente inregs und outregs sind Zeiger auf Unions vom Typ REGS, der in dos.h definiert ist. Vor dem Systemaufruf werden die Inhalte der durch inregs adressierten Union in die entsprechenden Register geladen. Nach Ausführung des Interrupts werden die aktuellen Registerinhalte in die durch outregs adressierte Union kopiert. Ein gesetztes Carry-Flag (in outregs das x.cflag-Feld) zeigt an, daß ein Fehler aufgetreten ist. inregs und outregs können die gleiche Adresse haben. int86x() übernimmt zusätzlich Werte für die Segment-Register aus der durch segres definierten Struktur. Return-Wert: : Die Funktionen geben den Wert des AX- Registers nach dem Interruptaufruf zurück. Querverweis : int86x intdos intr Beispiel : s.u. UNIX : Solaris 2.x / SunOS 4.1.x : nicht vorhanden 153 154 KAPITEL 4. FUNKTIONEN Beispiel zur Funktion int86() #include <stdio.h> #include <conio.h> #include <dos.h> #define VIDEO 0x10 /* Interrupt-Nummer */ void movetoxy(int x, int y) { union REGS regs; regs.h.ah = 2; /* Subfunktion Cursor postionieren */ regs.h.dh = y; regs.h.dl = x; regs.h.bh = 0; /* Videoseite Nr. 0 */ int86(VIDEO, &regs, &regs); } int main(void) { clrscr(); movetoxy(35, 10); printf("Hello world\n"); return 0; } 4.76. INTDOS() 4.76 155 intdos() Name : intdos — allgemeiner DOS-Funktionsaufruf. Benutzung : int intdos(union REGS *inregs, union REGS *outregs); Prototyp in : <dos.h> Beschreibung : intdos() (intdos) führt den DOS-Interrupt 0x21 aus, um eine angegebene Funktion anzusprechen. Der Wert von inregs.h.al gibt an, welche DOS-Funktion angesprochen wird. Nach dem Interrupt 0x21 kopiert intdos die aktuellen Registerwerte nach outregs. Ein gesetztes Carry-Flag (in outregs das x.cflag-Feld) zeigt an, daß ein Fehler aufgetreten ist. inregs und outregs können die gleiche Adresse haben. Return-Wert: : Die Funktion intdos liefert den Wert vom AX-Register. Querverweis : geninterrupt int86 int86x intr Beispiel : s.u. UNIX : Solaris 2.x / SunOS 4.1.x : nicht vorhanden 156 KAPITEL 4. FUNKTIONEN Beispiel zur Funktion intdos() #include <stdio.h> #include <dos.h> /* loescht Dateinamen; liefert bei erfolgreicher Operation 0 zurueck, ansonsten einen Wert ungleich Null */ int delete_file(char near *filename) { union REGS regs; int ret; /* loescht Datei */ regs.h.ah = 0x41; regs.x.dx = (unsigned) filename; ret = intdos(&regs, &regs); /* Fehler, falls das Carry-Flag gesetzt ist */ return(regs.x.cflag ? ret : 0); } int main(void) { int err; err = delete_file("NOTEXIST.$$$"); if (!err) printf("NOTEXIST.$$$ wurde geloescht.\n"); else printf("NOTEXIST.$$$ kann nicht " "geloescht werden.\n"); return 0; } 4.77. IOCTL() 4.77 157 ioctl() Name : ioctl — direkte Steuerung von Peripheriegeräten. Benutzung : int ioctl(int handle, int func [,void *argdx, int argcx]); Prototyp in : <io.h> Beschreibung : ioctl() (ioctl) verwendet unter DOS die DOS-Funktion 0x44. Das Argument func kann folgende Werte annehmen: func 0 1 2 3 4 5 6 7 8 11 Return-Wert: : Bedeutung Ermittelt die Geräteinformation Setzen von Geräteinformation über argdx Lese von argcx Bytes vom Gerät in den Bereich, auf den argdx zeigt. Schreibt von argcx Bytes zu dem Gerät, argdx zeigt auf die Startadresse im Speicher. Wie 2, unter Berücksichtigung von handle als Laufwerksnummer: laufwerk Bedeutung 0 für das aktuelle Laufwerk 1 für das Laufwerk A 2 für das Laufwerk B ... usw. Wie 3, unter Berücksichtigung von handle als Laufwerksnummer. Ermittelt den Eingabe-Status Ermittelt den Ausgabe-Status Prüfung, ob der Datenträger auswechselbar ist (ab DOS 3.x) Setzen der Anzahl der Wiederholversuche bei Kollisionen im SHARED-Betrieb (ab DOS 3.x). Die Funktion ioctl liefert für func folgende Werte : laufwerk 0,1 2,5 6,7 Fehler Bedeutung Geräteinformation (im DX-Register) Anzahl der tatsächlich gelesenen/geschriebenen Bytes Geräte-Status -1 Querverweis : geninterrupt int86 int86x intr Beispiel : s.u. 158 KAPITEL 4. FUNKTIONEN UNIX : Solaris 2.x / SunOS 4.1.x : Parametertypen wie oben, Headerdatei ist <unistd.h> Systemaufruf für Devices - “Files“ anwendbar. Beispiel zur Funktion ioctl() für DOS #include <stdio.h> #include <dir.h> #include <io.h> int main(void) { int stat; /* die Subfunktion 8 stellt fest, ob das Medium im voreingestellten Laufwerk auswechselbar ist */ stat = ioctl(0, 8, 0, 0); if (!stat) printf("Laufwerk %c ist austauschbar.\n", getdisk() + ’A’); else printf("Laufwerk %c ist nicht " "austauschbar.\n", getdisk() + ’A’); return 0; } 4.78. ISALNUM() 4.78 159 isalnum() Name : isalnum — Überprüfung alphanumerisches Zeichen. Benutzung : int isalnum(int c); Prototyp in : <ctype.h> (ANSI) Beschreibung : isalnum() (is alphanumeric) überprüft, ob das Zeichen c ein alphanumerisches Zeichen ist. ’A . . . Z’, ’a . . . z’, ’0 . . . 9’ Berücksichtigt werden die Codes im ASCII-Zeichensatz von 0-127, ohne deutsche Umlaute und ß. Return-Wert: : Das Makro liefert einen Wert ungleich 0 (TRUE), wenn das Zeichen alphanumerisch ist, sonst den Wert 0 (FALSE). Beispiel : s.u. UNIX : Solaris 2.x / SunOS 4.1.x : wie oben Beispiel zur Funktion isalnum() #include <stdio.h> #include <ctype.h> void main(void) { int c; printf("Geben Sie einen ASC-Code (0-255) ein \n"); c=getchar(); if(isalnum(c)) printf("Das Zeichen %c ist alphanumerisch \n",c); else printf("Das Zeichen %c ist nicht alphanumerisch ! \n",c); } 160 4.79 KAPITEL 4. FUNKTIONEN isalpha() Name : isalpha — Überprüfung alphabetisches Zeichen. Benutzung : int isalpha(int c); Prototyp in : <ctype.h> (ANSI) Beschreibung : isalpha() (is alphabetic) überprüft, ob das Zeichen c ein alphabetisches Zeichen ist ’A . . . Z’, ’a . . . z’ Berücksichtigt werden die Codes im ASC-Zeichensatzt von 0-127, ohne deutsche Umlaute und ß. Return-Wert: : Das Makro liefert einen Wert ungleich 0 (TRUE), wenn das Zeichen alphabetisch ist, sonst den Wert 0 (FALSE). Querverweis : Beispiel : s.u. UNIX : Solaris 2.x / SunOS 4.1.x : wie oben Beispiel zur Funktion isalpha() #include <stdio.h> #include <ctype.h> void main(void) { int c; printf("Geben Sie einen ASC-Code (0-255) ein \n"); c=getchar(); if(isalpha(c)) printf("Das Zeichen %c ist ein Buchstabe \n",c); else printf("Das Zeichen %c ist ein kein Buchstabe ! \n",c); } 4.80. ISASCII() 4.80 161 isascii() Name : isascii — Überprüfung ASCII-Zeichen. Benutzung : int isascii(int c); Prototyp in : <ctype.h> (ANSI) Beschreibung : isascii() (is ASCII) überprüft, ob das Zeichen c ein ASCII- Zeichen ist (0-127). Um das Zeichen in ein Standard-ASCII-Zeichen umzuwandeln, kann das Makro toascii() verwendet werden. Return-Wert: : Das Makro liefert einen Wert ungleich 0 (TRUE), wenn das Zeichen ein Standard- ASCII-Zeichen ist, sonst den Wert 0 (FALSE). Querverweis : Beispiel : s.u. UNIX : Solaris 2.x / SunOS 4.1.x : wie oben, überprüft wird 0–177 bzw. 0–200 Beispiel zur Funktion isascii() #include <stdio.h> #include <ctype.h> void main(main) { int c; printf("Geben Sie einen ASC-Code (0-255) ein \n"); c=getchar(); if(isascii(c)) printf("Das Zeichen %c ist ein Standard-ASCII Zeichen \n",c); else printf("Das Zeichen %c ist kein Standard-ASCII Zeichen ! \n",c); } 162 KAPITEL 4. FUNKTIONEN 4.81 isatty() Name : isatty — Gerätetyp überprüfen. Benutzung : int isatty(int c); Prototyp in : <ctype.h> Beschreibung : isatty() (is atty) überprüft, ob das über handle angegebene Peripheriegerät in eine der folgenden Klasse fällt : • Terminal • Konsole • Drucker • serielle Schnittstelle Return-Wert: : Arbeitet das Gerät zeichenorientiert, wird ein Wert ungleich 0 = (TRUE), sonst der Wert 0 (FALSE) zurückgegeben. Beispiel : s.u. UNIX : Solaris 2.x / SunOS 4.1.x : Headerfile ist <stdlib.h>; liefert 1, wenn c ein Terminal bezeichnet, sonst 0. Beispiel zur Funktion isatty() #include <stdio.h> #include <io.h> int main(void) { int handle; /* liefert den Handle der Standard- Druckerschnittstelle (PRN:) */ handle = fileno(stdprn); if (isatty(handle)) printf("PRN: arbeitet zeichenorientiert\n"); else printf("PRN: arbeitet nicht zeichenorientiert\\n"); return 0; } 4.82. ISCNTRL() 4.82 163 iscntrl() Name : iscntrl — Überprüfung Steuerzeichen. Benutzung : int iscntrl(int c); Prototyp in : <ctype.h> (ANSI) Beschreibung : iscntrl() (is control) überprüft, ob das Zeichen c ein Steuerzeichen ist. Berücksichtigt werden die Codes im ASC-Zeichensatzt 0-31 und 127 (DELETE). Return-Wert: : Das Makro liefert einen Wert ungleich 0 (TRUE), wenn das Zeichen ein Steuerzeichen ist, sonst den Wert 0 (FALSE). Querverweis : Beispiel : s.u. UNIX : Solaris 2.x / SunOS 4.1.x : wie oben Beispiel zur Funktion iscntrl() #include <stdio.h> #include <ctype.h> void main(void) { int c; printf("Geben Sie einen ASC-Code (0-255) ein \n"); c=getchar(); if(iscntrl(c)) printf("Das Zeichen ist ein Steuerzeichen \n"); else printf("Das Zeichen ist kein Steuerzeichen ! \n"); } 164 4.83 KAPITEL 4. FUNKTIONEN isdigit() Name : isdigit — Überprüfung Ziffer. Benutzung : int isdigit(int c); Prototyp in : <ctype.h> (ANSI) Beschreibung : isdigit() (is digit) überprüft, ob das Zeichen c eine Ziffer ist, im Bereich von : 0 ...9 Return-Wert: : Das Makro liefert einen Wert ungleich 0 (TRUE), wenn das Zeichen eine Ziffer ist, sonst den Wert 0 (FALSE). Querverweis : Beispiel : s.u. UNIX : Solaris 2.x / SunOS 4.1.x : wie oben Beispiel zur Funktion isdigit() #include <stdio.h> #include <ctype.h> void main(main) { int c; printf("Geben Sie einen ASC-Code (0-255) ein \n"); c=getchar(); if(isdigit(c)) printf("Das Zeichen %c ist eine Ziffer \n",c); else printf("Das Zeichen %c ist keine Ziffer ! \n",c); } 4.84. ISGRAPH() 4.84 165 isgraph() Name : isgraph — Überprüfung graphisches Zeichen. Benutzung : int isgraph(int c); Prototyp in : <ctype.h> (ANSI) Beschreibung : isgraph() (is graphical) überprüft, ob das Zeichen c ein graphisches Zeichen ist. Berücksichtigt werden die Codes im ASC-Zeichensatzt von 33-126. Das Leerzeichen ist kein graphisches, aber ein druckbares Zeichen. Return-Wert: : Das Makro liefert einen Wert ungleich 0 (TRUE), wenn es ein grahisches Zeichen ist, sonst den Wert 0 (FALSE). Querverweis : Beispiel : s.u. UNIX : Solaris 2.x / SunOS 4.1.x : wie oben Beispiel zur Funktion isgraph() #include <stdio.h> #include <ctype.h> void main(void) { int c; printf("Geben Sie einen ASC-Code (0-255) ein \n"); c=getchar(); if(isgraph(c)) printf("Das Zeichen %c ist ein graphisches Zeichen \n",c); else printf("Das Zeichen %c ist kein graphisches Zeichen ! \n",c); } 166 4.85 KAPITEL 4. FUNKTIONEN islower() Name : islower — Überprüfung Kleinbuchstabe. Benutzung : int islower(int c); Prototyp in : <ctype.h> (ANSI) Beschreibung : islower() (is lower) überprüft, ob das Zeichen c ein Kleinbuchstabe (a . . . z) ist. Berücksichtigt werden die Codes im ASC-Zeichensatzt von 0-127, ohne die deutsche Umlaute und ß. Das Makro tolower() kann verwendet werden, um einen Großbuchstaben in einen Kleinbuchstaben umzuwandeln. Return-Wert: : Das Makro liefert einen Wert ungleich 0 (TRUE), wenn das Zeichen ein Kleinbuchstabe ist, sonst den Wert 0 (FALSE). Beispiel : s.u. UNIX : Solaris 2.x / SunOS 4.1.x : wie oben Beispiel zur Funktion islower() #include <stdio.h> #include <ctype.h> void main(main) { int c; printf("Geben Sie einen ASC-Code (0-255) ein \n"); c=getchar(); if(islower(c)) printf("Das Zeichen %c ist ein Kleinbuchstabe \n",c); else printf("Das Zeichen %c ist kein Kleinbuchstabe ! \n",c); } 4.86. ISPRINT() 4.86 167 isprint() Name : isprint — Überprüfung druckbares Zeichen. Benutzung : int isprint(int c); Prototyp in : <ctype.h> (ANSI) Beschreibung : isprint() (is printable) überprüft, ob das Zeichen c ein druckbares Zeichen ist. Berücksichtigt werden die Codes im ASC-Zeichensatzt von 32-127. Return-Wert: : Das Makro liefert einen Wert ungleich 0 (TRUE), wenn das Zeichen druckbar ist, sonst den Wert 0 (FALSE). Querverweis : Beispiel : s.u. UNIX : Solaris 2.x / SunOS 4.1.x : wie oben Beispiel zur Funktion isprint() #include <stdio.h> #include <ctype.h> void main(void) { int c; printf("Geben Sie einen ASC-Code (0-255) ein \n"); c=getchar(); if(isprint(c)) printf("Das Zeichen %c ist druckbar \n",c); else printf("Das Zeichen %c ist nicht druckbar ! \n",c); } 168 4.87 KAPITEL 4. FUNKTIONEN ispunct() Name : ispunct — Überprüfung Interpunktionszeichen. Benutzung : int ispunct(int c); Prototyp in : <ctype.h> (ANSI) Beschreibung : ispunct() (is punct) überprüft, ob das Zeichen c ein InterpunktionsZeichen ist. Berücksichtigt werden die Codes im ASCII–Zeichensatz von 33-126, also : 33 . . . 47, 58 . . . 64, 91 . . . 96, 123 . . . 126 Das sind alle graphischen Zeichen ohne Ziffern und Buchstaben. Return-Wert: : Das Makro liefert einen Wert ungleich 0 (TRUE), wenn es ein Interpunktionszeichen ist, sonst den Wert 0 (FALSE). Querverweis : Beispiel : s.u. UNIX : Solaris 2.x / SunOS 4.1.x : wie oben Beispiel zur Funktion ispunct() #include <stdio.h> #include <ctype.h> void main(void) { int c; printf("Geben Sie einen ASC-Code (0-255) ein \n"); c=getchar(); if(ispunct(c)) printf("Das Zeichen %c ist ein Interpunktionszeichen \n",c); else printf("Das Zeichen %c ist kein Interpunktionszeichen ! \n",c); } 4.88. ISSPACE() 4.88 169 isspace() Name : isspace — Überprüfung Zwischenraum. Benutzung : int isspace(int c); Prototyp in : <ctype.h> (ANSI) Beschreibung : isspace() (is space) überprüft, ob das Zeichen c ein ZwischenraumZeichen ist, d.h. ein horizontales oder vertikales Tabulatorzeichen, ein Zeichen für Zeilen-/Seitenvorschub, CR-Zeichen oder ein blank ist. Berücksichtigt werden die Codes im ASCII–Zeichensatz zwischen 9-13 und 32. Return-Wert: : Das Makro liefert einen Wert ungleich 0 (TRUE), wenn es ein Zwischenraumzeichen ist, sonst den Wert 0 (FALSE). Querverweis : Beispiel : s.u. UNIX : Solaris 2.x / SunOS 4.1.x : wie oben Beispiel zur Funktion isspace() #include <stdio.h> #include <ctype.h> void main(void) { int c; printf("Geben Sie einen ASC-Code (0-255) ein \n"); c=getchar(); if(isspace(c)) printf("Das Zeichen %c ist ein Zwischenraumzeichen \n",c); else printf("Das Zeichen %c ist kein Zwischenraumzeichen ! \n",c); } 170 4.89 KAPITEL 4. FUNKTIONEN isupper() Name : isupper — Überprüfung Großbuchstabe. Benutzung : int isupper(int c); Prototyp in : <ctype.h> (ANSI) Beschreibung : isupper() (is upper) überprüft, ob das Zeichen c ein Großbuchstabe ist. Berücksichtigt werden die Codes im ASCII–Zeichensatz von 0-127, ohne deutsche Umlaute. Return-Wert: : Das Makro liefert einen Wert ungleich 0 (TRUE), wenn das Zeichen ein Großbuchstabe ist, sonst den Wert 0 (FALSE). Querverweis : Beispiel : s.u. UNIX : Solaris 2.x / SunOS 4.1.x : wie oben Beispiel zur Funktion isupper() #include <stdio.h> #include <ctype.h> void main(void) { int c; printf("Geben Sie einen ASC-Code (0-255) ein \n"); c=getchar(); if(isupper(c)) printf("Das Zeichen %c ist ein Grossbuchstabe \n",c); else printf("Das Zeichen %c ist kein Grossbuchstabe ! \n",c); } 4.90. ISXDIGIT() 4.90 171 isxdigit() Name : isxdigit — Überprüfung Hexadezimal. Benutzung : int isxdigit(int c); Prototyp in : <ctype.h> Beschreibung : (ANSI) isxdigit() (is hexadecimal digit) überprüft, ob das Zeichen c eine Hexadezimal- Ziffer ist. Berücksichtigt werden : 0 . . . 9, A . . . F, a . . . f. Return-Wert: : Das Makro liefert einen Wert ungleich 0 (TRUE), wenn das Zeichen eine Hexadezimalziffer ist, sonst den Wert 0 (FALSE). Querverweis : Beispiel : s.u. UNIX : Solaris 2.x / SunOS 4.1.x : wie oben Beispiel zur Funktion isxdigit() #include <stdio.h> #include <ctype.h> void main(void) { int c; printf("Geben Sie einen ASC-Code (0-255) ein \n"); c=getchar(); if(isxdigit(c)) printf("Das Zeichen %c ist eine Hexadezimalziffer \n",c); else printf("Das Zeichen %c ist keine Hexadezimalziffer ! \n",c); } 172 KAPITEL 4. FUNKTIONEN 4.91 itoa() Name : itoa — konvertiert einen Integer-Wert in einen String. Benutzung : char *itoa(int i, char *string, int basis); Prototyp in : <stdlib.h> Beschreibung : itoa() (itoa) konvertiert einen Integer-Wert in einen String um, welcher mit dem \0-Zeichen abgeschlossen wird, und schreibt diesen in die Variable string. Die Variable basis gibt die Basis des Zahlensystems an und muß im Bereich von 0 . . . 36 liegen. Ist die Basis basis=10 und i < 0, wird dem Ergebnis ein Minuszeichen vorangestellt. Return-Wert: : Die Funktion liefert einen Zeiger auf string zurück. Querverweis : Beispiel : s.u. UNIX : Solaris 2.x / SunOS 4.1.x : nicht vorhanden Beispiel zur Funktion itoa() #include <stdlib.h> #include <stdio.h> int main(void) { int number = 12345; char string[25]; itoa(number, string, 10); printf("Integer = %d\n" "String = %s\n", number, string); return 0; } 4.92. KBHIT() 4.92 173 kbhit() Name : kbhit — überprüft Tastatureingabe. Benutzung : int kbhit(void); Prototyp in : <conio.h> Beschreibung : kbhit() (kbhit) überprüft, ob ein Zeichen über die Tastatur eingegeben wurde. Die Zeichen können mit getch() oder getche gelesen werden. Return-Wert: : Wenn ein Zeichen gelesen wurde, liefert die Funktion kbhit den Wert 0, sonst einen Wert ungleich 0. Querverweis : getch getche Beispiel : s.u. UNIX : Solaris 2.x / SunOS 4.1.x : nicht vorhanden Beispiel zur Funktion kbhit() #include <conio.h> int main(void) { cprintf("Druecken Sie eine beliebige " "Taste!"); /* wartet auf den Tastendruck */ while (!kbhit()); cprintf("\r\nTaste gelesen!\r\n"); return 0; } 174 KAPITEL 4. FUNKTIONEN 4.93 labs() Name : labs — berechnet den Absolutwert eines long-Wertes. Benutzung : long labs(long x); Prototyp in : <stdlib.h, math.h> (ANSI) Beschreibung : labs() (long absolute value) berechnet den Absolutwert eines longWertes. Für die Berechnung des Absolutwertes einer Zahl vom Typ int oder double kann die Funktion abs() bzw. fabs() verwendet werden. Return-Wert: : Der Absolutwert von x, d.h. • x, f alls x ≥ 0, • −x, f alls x < 0 Querverweis Beispiel : : s.u. UNIX : Solaris 2.x / SunOS 4.1.x : wie oben Beispiel zur Funktion labs() #include <stdio.h> #include <math.h> int main(void) { long result; long x = -12345678L; result= labs(x); printf("Der absolute Betrag von %ld ist %ld\n", x, result); return 0; } 4.94. LDEXP() 4.94 175 ldexp() Name : ldexp — berechnet x ∗ 2exp . Benutzung : double ldexp(double m, int exp); Prototyp in : <math.h> Beschreibung : ldexp() (ldexp) berechnet den Wert x ∗ 2exp . Return-Wert: : Die Funktion liefert den Wert für x ∗ 2exp zurück. Querverweis Beispiel : : s.u. UNIX : Solaris 2.x / SunOS 4.1.x : wie oben Beispiel zur Funktion ldexp() #include <stdio.h> #include <math.h> int main(void) { double e = 3, x = 5; /* berechnet (2 ** 3) * 5 */ printf("2 hoch %lf mal %lf ist %lf\n", e, x, ldexp(x,e)); return 0; } (ANSI) 176 4.95 KAPITEL 4. FUNKTIONEN ldiv() Name : ldiv — führt eine long-Division durch. Benutzung : ldiv t ldiv(long x, long y); Prototyp in : <stdlib.h> Beschreibung : (ANSI) ldiv() (long divide) dividiert x durch y. Der ganzahlige Anteil des Ergebnisses und der Divisonsrest wird in einer Struktur vom Typ ldiv t abgelegt. Dieser Strukturtyp ist in stdlib.h wie folgt definiert : typedef struct { long int quot; /* Quotient */ long int rem; /* Divisionsrest */ } ldiv t; Return-Wert: : Es wird eine Struktur des beschriebenen Datentyps zurückgeliefert. Querverweis : div Beispiel : s.u. UNIX : Solaris 2.x : wie oben SunOS 4.1.x : nicht vorhanden Beispiel zur Funktion ldiv() #include <stdlib.h> #include <stdio.h> ldiv_t lx; int main(void) { lx = ldiv(100000L, 30000L); printf("100000 dividiert durch 30000 = %ld Rest %ld\n", lx.quot, lx.rem); return 0; } 4.96. LFIND() 4.96 177 lfind() Name : lfind — lineare Suche im Array. Benutzung : void *lfind(const void *key, const void *base, size t *num, size t width, int (*fcmp)(const void *,const void *)) ; Prototyp in : <stdlib.h> Beschreibung : lfind() (lfind) durchsucht ein sequentielles angeordenetes Array nach dem Wert des Schlüsselfeldes key. Die Suche erfolgt dabei linear. lfind() verwendet eine vom Programmierer erstellte Vergleichsroutine fcmp(). Der Parameter base muß auf das erste Element des Arrays zeigen, num auf einen Integer, der die Anzahl der Array-Elemente enthält. width gibt die Größe des einzelnen Elements in Bytes an. Return-Wert: : lfind() liefert einen Zeiger auf das erste Element des Arrays zurück, das mit dem gesuchten Schlüsselwort identisch ist. Falls der gesuchte Eintrag nicht vorhanden ist, wird der Wert NULL zurückgeliefert. Die Vergleichsroutine muß für: *elem1 == *elem2 den Wert NULL liefern, andernfalls einen Wert ungleich NULL. Querverweis Beispiel : : bsearch lsearch qsort s.u. UNIX : Solaris 2.x / SunOS 4.1.x : Headerdatei ist <search.h>, sonst wie oben. 178 Beispiel zur Funktion lfind() /* lfind-Beispiel */ #pragma warn -rpt #include <stdio.h> #include <stdlib.h> typedef (*fcmp)(const void *, const void *); int compare(int *x, int *y) { return( *x - *y ); } int main(void) { int array[5] = {35, 87, 46, 99, 12}; int key; unsigned int num = 5; int *result; key = 99; result = (int *) lfind(&key, array, &num, sizeof(int), (fcmp) compare); if (result) printf("%d gefunden\n",key); else printf("%d nicht gefunden\n",key); return 0; } KAPITEL 4. FUNKTIONEN 4.97. LOCALTIME() 4.97 179 localtime() Name : localtime — konvertiert Anzahl von Sekunden in Datum und Uhrzeit. (ANSI) Benutzung : struct tm *localtime(const time t *sec); Prototyp in : <stdlib.h, math.h> Beschreibung : localtime() (local time) wandelt die mit sec angegebene Anzahl von Sekunden, die seit dem 1. Januar 1970, 0 Uhr vergangen sind, in das lokale Datum mit Uhrzeit um. Es werden dabei die Zeitzonen und die Sommerzeit berücksichtigt. Die aktuelle Anzahl der Sekunden erhält man durch der Funktion time(). Der Datentyp time t ist in time.h als long definiert. Die Struktur tm ist wie folgt definiert: struct tm { int tm int tm int tm int tm int tm int tm int tm int tm int tm sec; /* Sekunden */ min; /* Minuten */ hour; /* Stunden (0..23) */ mday; /* Tag im Monat (1..31) */ mon; /* Monat (0..11) */ year; /* Jahr */ wday; /* Wochentag (0..6) */ yday; /* Tag im Jahr (0..365) */ isdst; /* Sommerzeit */ }; Die Zählung der Wochentage beginnt mit Sonntag (Wert 0). Wenn tm isdst einen Wert ungleich NULL hat, wird mit Sommerzeit gerechnet. Return-Wert: : Die Funktion liefert einen Zeiger auf eine Struktur vom Typ tm, die das lokale Datum und die Uhrzeit in umgewandelter Form enthält. Querverweis : Beispiel : asctime ctime ftime gmtime stime time s.u. UNIX : Solaris 2.x / SunOS 4.1.x : Headerdatei ist <time.h>, sonst wie oben 180 KAPITEL 4. FUNKTIONEN Beispiel zur Funktion localtime() #include #include #include #include <time.h> <stdio.h> <time.h> <dos.h> /* Mitteleuropaeische Zeit & Sommerzeit */ char *tzstr = "TZ=MEZ-1MES"; int main(void) { time_t t; struct tm *area; /* schreibt den time zone-String in die Environment-Tabelle */ putenv(tzstr); tzset(); t = time(NULL); area = localtime(&t); printf("Ortszeit: %s", asctime(area)); return 0; } 4.98. LOG() 4.98 181 log() Name : log — berechnet den natürlichen Logarithmus. #include Benutzung : : <math.h> double log(double x); (real) complex log(complex x); (komplex) Prototyp in : <math.h,complex.h> (ANSI) Beschreibung : log() (logarithm) berechnet den natürlichen Logarithmus von x nach der Gleichung : x = en und ist die Umkehrfunktion von exp. Die Funktion ist nur für positive Werte von x definiert. Der komplexe natürliche Logarithmus wird nach der Gleichung: log(x) = log(abs(x)) + i ∗ arg(x)) berechnet. Return-Wert: : Die Funktion liefert den natürlichen Algorithmus des Argumentes zurück. Ist das Argument negativ, so wird HUGE VAL zurückgegeben und die Fehlervariable errno erhält den Wert EDOM (=domain error). Ist das Argument 0, so wird HUGE VAL zurückgegeben und die Fehlervariable errno erhält den Wert ERANGE (=range error). Querverweis : complex exp log10 sqrt Beispiel : printf(“log(0.5) = %7.4f\n“,log(0.5)); printf(“log(1.0) = %7.4f\n“,log(1.0)); printf(“log(3.0) = %7.4f\n“,log(3.0)); Ergebnis : log(0.5) = -0.6931 log(1.0) = 0.0000 log(3.0) = 1.0986 UNIX : Solaris 2.x / SunOS 4.1.x : wie oben 182 KAPITEL 4. FUNKTIONEN Beispiel zur Funktion log() #include <math.h> #include <stdio.h> int main(void) { double x = 8.6872; printf("Der natuerliche Logarithmus von " "%lf ist %lf\n", x, log(x)); return 0; } 4.99. LOG10() 4.99 183 log10() Name : log10 — berechnet den Logarithmus zur Basis 10. #include Benutzung : : <math.h> double log10(double x); (real) complex log10(complex x); (komplex) Prototyp in : <math.h,complex.h> (ANSI) Beschreibung : log10() (logarithm) berechnet den Logarithmus von x nach der Gleichung : x = 10n . Die Funktion ist nur für positive Werte von x definiert. Der komplexe Logarithmus zur Basis 10 wird nach der Gleichung: log10(x) = log10(x) /log(10) berechnet. Return-Wert: : Die Funktion liefert den Logarithmus zur Basis 10 zurück. Ist das Argument negativ, so wird HUGE VAL zurückgegeben und die Fehlervariable errno erhält den Wert EDOM (=domain error). Ist das Argument 0, so wird HUGE VAL zurückgegeben und die Fehlervariable errno erhält den Wert ERANGE (=range error). Querverweis Beispiel : : complex exp log printf(“log10(0.1) = %4.1f\n“,log10(0.1)); printf(“log10(1.0) = %4.1f\n“,log10(1.0)); printf(“log10(10.0) = %4.1f\n“,log10(10.0)); Ergebnis : log10(0.1) = -1.0 log10(1.0) = 0.0 log10(10.0) = 1.0 UNIX : Solaris 2.x / SunOS 4.1.x : wie oben Beispiel zur Funktion log10() #include <math.h> #include <stdio.h> int main(void) { double x = 800.6872; printf("Der dekadische Logarithmus von " "%lf ist %lf\n", x, log10(x)); return 0; } 184 4.100 KAPITEL 4. FUNKTIONEN longjmp() Name : longjmp — führt Rücksprung zum gespeicherten Umgebungszustand durch. (ANSI) #include Benutzung : : <setjmp.h> void longjmp(jmp buf env, int retval); Prototyp in : <setjmp.h> Beschreibung : longjmp() (long jump) kann einen Sprung nicht zwingenderweise im lokalen Bereich innerhalb des Programms ausführen. longjmp() verzweigt an die Stelle, wo zuvor setjmp() aufgerufen wurde. Beim Aufruf von setjmp() wird der momentane Maschinenzustand (Prozeß bei UNIX) und die Stack-Umgebung in den Puffer env gerettet. Der Datentyp jmp buf ist in setjmp.h() definiert. Durch den Aufruf der Funktion longjmp() wird der alte Zustand wiederhergestellt und die Programmausführung unmittelbar nach dem Aufruf von setjmp fortgesetzt. Das Programm kann anhand des Return-Wertes von setjmp() entscheiden, ob an dieser Stelle setjmp() aufgerufen oder über longjmp() zurückverzweigt wurde: setjmp() liefert den Return-Wert 0; dieser Wert wird beim Rücksprung mit longjmp() auf einen Wert ! = 0 gesetzt, mittels Variable retval. Dieser muß daher von 0 verschieden sein, z.B. auf 1 gesetzt sein. Die Funktionen setjmp() und longjmp() werden typischerweise zur Fehlerbehandlung eingesetzt. Hinweis : Vorsicht bei Overlay-Anwendungen ! Nicht in normalen Anwenderprogrammen ! Return-Wert: : Keiner Querverweis : ctrlbrk setjmp signal Beispiel : s.u. UNIX : Solaris 2.x / SunOS 4.1.x : wie oben 4.100. LONGJMP() Beispiel zur Funktion longjmp() #include <stdio.h> #include <setjmp.h> #include <process.h> jmp_buf jumper; void subroutine(void); int main(void) { int value; /* value erhaelt von setjmp den Wert 0 */ value = setjmp(jumper); /* longjmp nimmt das Programm an dieser Stelle wieder auf und weist value einen Wert != 0 zu */ if (value != 0) { printf("Longjmp() lieferte den Wert " "%d\n", value); exit (value); } printf("Es folgt der Aufruf von " "subroutine() ... \n"); subroutine(); return 0; } void subroutine(void) { longjmp(jumper,1); } 185 186 4.101 KAPITEL 4. FUNKTIONEN lseek() Name : lseek — verschiebt den Schreib-/Lesezeiger. #include Benutzung : : <io.h> long lseek(int fp, long offset, int basis); Prototyp in : <io.h> Beschreibung : lseek() (long seek) verschiebt den Seek- Zeiger (Schreib-/Lesezeiger) mit dem File-Handle fp verbundene Datei um offset Bytes : basis 0 1 2 Bedeutung vom Dateianfang von der aktuellen Position vom Dateiende Der Seek-Zeiger darf nicht vor den Dateianfang positioniert werden. Wird der Seek-Zeiger hinter das Datei-Ende positioniert und anschließend eine Schreiboperation ausgeführt, so entsteht eine Lücke in der Datei mit undefiniertem Inhalt. Return-Wert: : Die Funktion liefert die aktuelle Position (= Wert des Dateizeigers) zurück. Bei falschem File-Pointer wird der Wert -1L zurückgeliefert, und die Fehlervariable errno wird auf EBADF (= bad file number) oder EINVAL (= ivalid argument) gesetzt. Querverweis : filelength fseek ftell getc open sopen ungetc write Beispiel : s.u. UNIX : Solaris 2.x / SunOS 4.1.x : Headerdatei ist <unistd.h>, sonst wie oben. 4.101. LSEEK() Beispiel zur Funktion lseek() #include #include #include #include #include <sys\stat.h> <string.h> <stdio.h> <fcntl.h> <io.h> int main(void) { int handle; char msg[] = "Das ist ein Test!\n"; char ch; /* erzeugt eine Datei */ handle = open("TEST.$$$", O_CREAT | O_RDWR, S_IREAD | S_IWRITE); /* schreibt einige Daten in die Datei */ write(handle, msg, strlen(msg)); /* positioniert auf den Anfang der Datei */ lseek(handle, 0L, SEEK_SET); /* liest bis zum Dateiende Zeichen aus der Datei */ do { read(handle, &ch, 1); printf("%c", ch); } while (!eof(handle)); close(handle); return 0; } 187 188 KAPITEL 4. FUNKTIONEN 4.102 malloc() Name : malloc — reserviert Speicherplatz. #include Benutzung : : <stdlib.h> void *malloc (size t size); Prototyp in : <alloc.h,stdlib.h> (ANSI) Beschreibung : malloc() (memory allocation) reserviert einen zusammenhängenden Speicherplatz von size Bytes. Der Datentyp size t ist in stdlib.h als unsigned int definiert. Der Block wird nicht initialisiert. Return-Wert: : Die Funktion gibt einen Zeiger auf die Anfangsadresse des zugeteilten Speicherbereiches zurück. Wenn nicht genügend Speicherplatz vorhanden ist oder size den Wert 0 hat, liefert die Funktion den NULL-Zeiger. Querverweis : allocmem calloc free realloc Beispiel : s.u. UNIX : Solaris 2.x : wie oben SunOS 4.1.x : Funktion ist als char *malloc(size) definiert, Headerdatei ist <malloc.h> 4.102. MALLOC() Beispiel zur Funktion malloc() #include #include #include #include <stdio.h> <string.h> <alloc.h> <process.h> int main(void) { char *str; /* versucht, Speicher fuer den String zu reservieren */ if ((str = malloc(10)) == NULL) { printf("Nicht genuegend Speicher fuer " "den String vorhanden\n"); exit(1); /* Ende mit Fehlercode */ } /* kopiert "Hallo" in den String */ strcpy(str, "Hallo"); /* gibt den String aus */ printf("Das ist der String: %s\n", str); /* gibt den Speicher fuer den String wieder frei */ free(str); return 0; } 189 190 4.103 KAPITEL 4. FUNKTIONEN memchr() Name : memchr — sucht Zeichen im String. #include Benutzung : : <string.h> void *memchr(const void *buffer, int c, size t n); Prototyp in : <string.h, mem.h> (ANSI) Beschreibung : memchr() (memory character) sucht in den ersten n Bytes von buffer des übergebenen Zeichens c. Der Datentyp size t ist in stdlib.h als unsigned int definiert. Für das Durchsuchen eines gesamten Strings kann die Funktion strchr() eingesetzt werden. Return-Wert: : Die Funktion gibt einen Zeiger auf die Stelle im Puffer (buffer), wo das gesuchte Zeichen zum ersten Mal auftritt. Kommt das Zeichen in den ersten n Bytes im Puffer nicht vor oder es tritt ein Fehler auf, liefert die Funktion den NULL-Zeiger zurück. Querverweis : strchr Beispiel : s.u. UNIX : Solaris 2.x: wie oben, nur in <memory.h> SunOS 4.1.x : char *memchr(char *s1, char *s2, int n) Headerdatei ist <memory.h> Beispiel zur Funktion memchr() #include <string.h> #include <stdio.h> int main(void) { char str[17]; char *ptr; strcpy(str, "Das ist ein String"); ptr = memchr(str, ’r’, strlen(str)); if (ptr) printf("Das Zeichen ’r’ befindet sich " "an Position: %d\n", ptr - str + 1); else printf("Zeichen nicht gefunden!\n"); return 0; } 4.104. MEMCMP() 4.104 191 memcmp() Name : memcmp — vergleicht n Bytes zweier Arrays. #include Benutzung : : <mem.h> int memcmp(const void *buf1, const void *buf2, size t n); Prototyp in : <string.h, mem.h> (ANSI) Beschreibung : memcmp() (memory compare) vergleicht die ersten n Bytes von buf1 mit denen von buf2. Bei dem ersten nichtübereinstimmenden Zeichen wird der Vergleich abgebrochen. Der Datentyp size t ist in stdlib.h als unsigned int definiert. Für den Vergleich von Strings können die Funktionen strcmp() und strncmp() verwendet werden. Return-Wert: : Die Funktion gibt einen int-Wert zurück: Wert <0 == 0 >0 Bedeutung wenn buf1 kleiner als buf2 ist wenn die Zeichenfolgen identisch sind wenn buf1 größer als buf2 ist Querverweis : strcmp strncmp Beispiel : s.u. UNIX : Solaris 2.x : wie oben, nur in <memory.h> SunOS 4.1.x : int memcmp(char *s1, char *s2, int n) Headerdatei ist <memory.h> 192 KAPITEL 4. FUNKTIONEN Beispiel zur Funktion memcmp() #include <stdio.h> #include <string.h> int main(void) { char *buf1 = "aaa"; char *buf2 = "bbb"; char *buf3 = "CCC"; int stat; stat = memcmp(buf1, buf2, strlen(buf1)); if (stat > 0) printf("buf1 ist groesser als buf2\n"); else printf("buf1 ist nicht groesser als " "buf2\n"); stat = memcmp(buf2, buf3, strlen(buf2)); if (stat > 0) printf("buf2 ist groesser als buf3\n"); else printf("buf2 ist nicht groesser als " "buf3\n"); return 0; } 4.105. MEMCPY() 4.105 193 memcpy() Name : memcpy — kopiert n Bytes aus Quell-Puffer in Ziel-Puffer. #include Benutzung : : <mem.h> void *memcpy(void *dest, const void *src, size t n); Prototyp in : <string.h, mem.h> (ANSI) Beschreibung : memcpy() (memory copy) kopiert n Bytes von Puffer src in den Puffer dest. Bei Überlappung von src und dest ist das Verhalten von memcpy undefiniert. Return-Wert: : Die Funktion gibt den Zeiger dest zurück. Querverweis : memcmp Beispiel : s.u. UNIX : Solaris 2.x : wie oben, nur in <memory.h> SunOS 4.1.x : char *memcpy(char *s1, char *s2, int n) Headerdatei ist <memory.h> Beispiel zur Funktion memcpy() #include <stdio.h> #include <string.h> int main(void) { char src[] = "******************************"; char dest[] = "abcdefghijlkmnopqrstuvwxyz0123456789"; char *ptr; printf("dest vor memcpy: %s\n", dest); ptr = memcpy(dest, src, strlen(src)); if (ptr) printf("dest nach memcpy: %s\n", dest); else printf("memcpy misslungen\n"); return 0; } 194 KAPITEL 4. FUNKTIONEN 4.106 memmove() Name : memmove — kopiert einen Block von n Bytes. #include Benutzung : : <mem.h> int *memmove(void *dest, const void *src, size t n); Prototyp in : <string.h, mem.h> (ANSI) Beschreibung : memmove() (memory copy) kopiert n Bytes von Puffer src in den Puffer dest. Bei Überlappung von src und dest ist sichergestellt, daß Zeichen aus dem Überlappungsbereich zuerst gelesen und überschrieben werden. Return-Wert: : Die Funktion gibt den Zeiger dest zurück. Querverweis : memcpy movmem Beispiel : s.u. UNIX : Solaris 2.x : wie oben, nur in <memory> SunOS 4.1.x : nicht vorhanden Beispiel zur Funktion memmove() #include <stdio.h> #include <string.h> int main(void) { char *src = "abcde1234567890"; char *dest; /* dest und src ueberlappen sich um 5 Bytes */ dest = src + 5; printf("src vor memmove: %s\n", src); /* kopiert auch die ueberlappenden 5 Bytes korrekt */ memmove(dest, src, 10); printf("src nach memmove: %s\n", src); return 0; } 4.107. MEMSET() 4.107 memset() Name : memset — setzen von n Bytes des Arrays mit konstantem Wert. (ANSI) #include Benutzung : : <mem.h, string.h> void *memset(void *dest, int c, size t n); Prototyp in : <string.h, mem.h> Beschreibung : memset() (memory set) füllt die ersten n Bytes von Puffer dest mit dem Wert von c auf. Return-Wert: : Die Funktion gibt den Zeiger dest zurück. Querverweis : memcpy setmem Beispiel : s.u. UNIX : Solaris 2.x : wie oben, nur in <memory.h> SunOS 4.1.x : char *memset(char *s, int c, int n) Beispiel zur Funktion memset() #include <string.h> #include <stdio.h> #include <mem.h> int main(void) { char buffer[] = "Hello world\n"; printf("Buffer vor memset: %s\n", buffer); memset(buffer, ’*’, strlen(buffer) - 1); printf("Buffer nach memset: %s\n", buffer); return 0; } 195 196 4.108 KAPITEL 4. FUNKTIONEN mktime() Name : mktime — konvertiert die Uhrzeit in das Kalenderformat. #include Benutzung : : <time.h> time t mktime(struct tm *ptr); Prototyp in : <time.h> Beschreibung : (ANSI) mktime() (make time) konvertiert die durch ptr vereinbarten Zeitangaben in die Anzahl von Sekunden, die seit dem 1. Januar 1970, 0 Uhr vergangen sind. Die Struktur tm ist wie folgt definiert: struct tm { int tm sec; /* Sekunden */ int tm min; /* Minuten */ int tm hour; /* Stunden (0..23) */ int tm mday; /* Tag im Monat (1..31) */ int tm mon; /* Monat (0..11) */ int tm year; /* Jahr */ int tm wday; /* Wochentag (0..6) */ int tm yday; /* Tag im Jahr (0..365) */ int tm isdst; /* Sommerzeit */ }; Die Komponenten tm wday und tm yday werden von mktime ignoriert und berechnet die Sekunden aus den übrigen Komponenten. Diese müssen nicht ihren üblichen Wertebereich haben; mktime() konvertiert die Werte so, daß sie ihren üblichen Wertebereich erhalten. Return-Wert: : Die Funktion liefert die Anzahl der Sekunden und im Fehlerfall eine -1. Querverweis Beispiel : : localtime time s.u. UNIX : Solaris 2.x : wie oben SunOS 4.1.x : nicht vorhanden 4.108. MKTIME() Beispiel zur Funktion mktime() #include <stdio.h> #include <time.h> char *wday[] = {"Sonntag", "Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Samstag", "unbekannter Tag" }; int main(void) { struct tm time_check; int year, month, day; /* Bitte geben Sie ein Datum ein, um den betreffenden Wochentag zu ermitteln */ printf("Geben Sie ein Datum nach dem " "1.1.1970 ein.\n"); printf("Jahr: "); scanf("%d", &year); printf("Monat: "); scanf("%d", &month); printf("Tag: "); scanf("%d", &day); /* laedt die Struktur mit den eingelesenen Daten */ time_check.tm_year = year - 1900; time_check.tm_mon = month - 1; time_check.tm_mday = day; time_check.tm_hour = 0; time_check.tm_min = 0; time_check.tm_sec = 1; time_check.tm_isdst = -1; /* ruft mktime auf, um den Wochentag zu ermitteln */ if (mktime(&time_check) == -1) time_check.tm_wday = 7; /* druckt den Wochentag aus */ printf("Dieser Tag ist ein %s.\n", wday[time_check.tm_wday]); return 0; } 197 198 4.109 KAPITEL 4. FUNKTIONEN modf() Name : modf — zerlegt x in einen gebrochenen und einen ganzahligen Anteil. (ANSI) Benutzung : double modf(double x, double *inpart); Prototyp in : <math.h> Beschreibung : modf() (modulo float) zerlegt den Wert von x in einen gebrochenen und einen ganzzahligen Anteil. Der ganzahlige Anteil wird in den von inpart adressierten Speicherbereich geschrieben. Return-Wert: : Die Funktion liefert den gebrochenen Anteil von x zurück. Querverweis Beispiel : : fmod double x = 123.456, y, z; z=modf(x,&y); printf(“Wert von x: %7.3f \n“,x); printf(“ganzzahliger Anteil: %7.3f \n“,y); printf(“gebrochener Anteil: %7.3f \n“,z); Ergebnis : Wert von x : 123.456 ganzzahliger Anteil: 123.000 gebrochener Anteil: 0.456 UNIX : Solaris 2.x /SunOS 4.1.x : wie oben 4.109. MODF() Beispiel zur Funktion modf() #include <math.h> #include <stdio.h> #include <conio.h> int main(void) { double fraction, integer; double number = -100000.567; fraction = modf(number, &integer); printf("Der ganzzahlige Anteil von %lf " "ist %lf,\ndie Nachkommastellen sind %lf\n", number, integer, fraction); getch(); return 0; } 199 200 4.110 KAPITEL 4. FUNKTIONEN open() Name : open — öffnet eine Datei. #include #include : : <fcntl.h> <sys \stat.h> Benutzung : int open(char *name, int modus [,int permission] ); Prototyp in : <io.h> Beschreibung : open() (open) eröffnet eine Datei mit dem Dateinamen name zum Lesen und/oder Schreiben oder erzeugt eine neue Datei. Da die Zugriffsart von den Compilern unterschiedlich behandelt wird, sollte für modus symbolische Konstanten benutzt werden, die in der Header-Datei fcntl.h definiert sind. Eine der nachfolgenden Konstanten ist mindestens anzugeben: modus O RDONLY O WDONLY O RDWR Bedeutung nur Lesen nur Schreiben Lesen und Schreiben Die folgenden Konstanten können durch | weiter verknüpft werden: modus O APPEND O CREAT Bedeutung Schreiben ab Dateiende Neue Datei erzeugen und zum Schreiben eröffnen. Falls die Datei existiert, hat dieses Flag keine Wirkung. O TRUNC Datei zum Schreiben öffnen und auf die Länge 0 kürzen. O BINARY Datei im Binärmodus eröffnen (DOS) O TEXT Datei im Textmodus eröffnen (DOS) Wird eine neue Datei mit O CREAT erzeugt, legt permission wie bei der Funktion creat() die Zugriffsrechte, auch für spätere Öffnungen fest. Das Argument permission ist optional und wird bei Anwendung von O CREAT gesetzt. Folgende Parameter sind in sys \stat.h definiert: permission S IWRITE S IREAD S IREAD | S IWRITE Bedeutung nur Schreiben erlaubt nur Lesen erlaubt Lesen und Schreiben erlaubt 4.110. OPEN() Return-Wert: : 201 Die Funktion liefert einen File-Handle zurück, wenn die Datei geöffnet werden konnte. Im Fehlerfall wird der Wert -1 zurückgegeben und die Fehlervariable errno enhält dann folgende Werte: errno EACESS EMFILE ENOENT EINVACC Bedeutung Zugriff nicht erlaubt Maximalzahl von Dateien bereits offen Falscher Dateiname oder Suchweg nicht vorhanden ungültiger Zugriffscode Querverweis : chmod chsize close creat creatnew createtemp fdopen filelenght fopen freopen getftime lock lseek read searchpath write Beispiel : s.u. UNIX : Solaris 2.x : wie oben, Headerdatei ist <fcntl.h> SunOS 4.1.x : wie oben, keine Headerdatei Beispiel zur Funktion open() #include #include #include #include #include <string.h> <stdio.h> <fcntl.h> <io.h> <sys\stat.h> int main(void) { int handle; char msg[] = "Hello world"; if ((handle = open("TEST.$$$", O_RDWR | O_CREAT | O_TEXT, S_IREAD | S_IWRITE))== -1) { perror("Fehler"); return 1; } write(handle, msg, strlen(msg)); close(handle); return 0; } 202 KAPITEL 4. FUNKTIONEN 4.111 perror() Name : perror — gibt Systemfehlermeldung aus. #include Benutzung : : <stdio.h> void perror(const char *string); Prototyp in : <stdio.h> Beschreibung : (ANSI) perror() (print error) kann nach einem Fehler aufgerufen werden. perror gibt auf stderr (normalerweise der Bildschirm) zwei Strings aus : • den vom Programmierer definierten String string; • danach einen Doppelpunkt, ein Leerzeichen und eine entsprechende Systemfehlermeldung (sys errlist); • einen Zeilenvorschub Return-Wert: : Keiner Querverweis : clearerr eof ferror matherr Beispiel : s.u. UNIX : Solaris 2.x : wie oben SunOS 4.1.x : nicht vorhanden Beispiel zur Funktion perror() #include <stdio.h> int main(void) { FILE *fp; fp = fopen("perror.dat", "r"); if (!fp) perror("Datei konnte nicht zum Lesen geoeffnet werden"); return 0; } 4.112. POW() 4.112 203 pow() Name : pow — berechnet die Potenz xy . #include Benutzung : : <math.h> double pow(double x, double y); Komplexe Version: #include <complex.h> complex pow(complex x, double y); complex pow(double x, complex y); Prototyp in : <math.h> oder <complex.h> Beschreibung : (ANSI) pow() (power) berechnet die Potenz xy . • Falls x < 0 ist, muß y ganzzahlig sein, • f alls x = 0 ist, muß y positiv sein. Return-Wert: : Die Funktion gibt den Wert xy zurück. Im Fall eines Über- oder Unterlaufs ist der Return-Wert HUGEVAL mit einem entsprechenden Vorzeichen versehen, und die Fehlervariable errno erhält den Wert ERANGE (= range error). Falls die Argumente nicht im zulässigen Definitionsbereich liegen, wird eine Fehlermeldung auf stderr ausgegeben und der Return-Wert ist 0. Die Fehlervariable errno erhält den Wert EDOM (= domain error). Querverweis : Beispiel : s.u. UNIX : Solaris 2.x / SunOS 4.1.x : wie oben Beispiel zur Funktion pow() #include <math.h> #include <stdio.h> int main(void) { double x = 2.0, y = 3.0; printf("%lf hoch %lf ist %lf\n", x, y, pow(x, y)); return 0; } 204 KAPITEL 4. FUNKTIONEN 4.113 printf() Name : printf — gibt formatiert auf dem Bildschirm aus. #include Benutzung : : <stdio.h> int printf(const char *string, . . . , /* arg1 . . . argn */); Prototyp in : <stdio.h> Beschreibung : (ANSI) printf() (print formatted) gibt den Format-String string auf Standardausgabe stdout aus, wobei die darin enthaltenen Formatelemente durch die Werte aus der Argumentliste arg1, . . . ,argn ersetzt werden. Ein Formatelement bestimmt, wie ein Argument aus der Argumentliste interpretiert und ausgegeben wird. Die Reihenfolge der Formatelemente entspricht der Argumentenliste. Dabei muß die Anzahl der Formatangaben mit der Anzahl der Argumente übereinstimmen. Ein Formatelement hat folgende Form: % [Flags] [Feldbreite] [.Genauigkeit] typ Flags besteht aus einem der Zeichen +, ⊔(blank), − oder einer Kombination dieser Zeichen. Sie haben folgende Wirkung: + - positive Zahlen werden mit einem Vorzeichen ausgegeben, ⊔ - positive Zahlen werden mit einem blank ausgegeben, - - linksbündige Ausgabe. Feldbreite ist einen positive Ganzzahl, welche die Länge eines Ausgabefeldes festlegt. Wenn der Feldbreite ein Minuszeichen vorangestellt ist, wird der entrechende Argumentwert linksbündig in das Feld gesetzt, andernfalls rechtsbündig. Der verbleibende Platz im Feld wird mit blanks aufgefüllt. Ist die auszugebende Zeichenfolge länger als das Feld, so wird sie vollständig ausgegeben, d.h. die Feldbreite wird vergrößert. 4.113. PRINTF() 205 Für die Ausgabe von Zahlen kann der Feldbreite eine 0 vorangestellt werden. Führende Leerstellen im Ausgabefeld werden dann mit Nullen aufgefüllt. Als Feldbreite kann auch ein Stern (*) angegeben werden. Dann wird die Feldbreite durch ein zusätzliches Argument bestimmt, das direkt vor dem auszugebenden Argument stehen und den Typ int haben muß. Genauigkeit legt bei der Ausgabe von Gleitkommazahlen mit den Typangaben f oder e die Anzahl der Ziffern fest, die hinter dem Dezimalpunkt ausgegeben werden. Bei der Ausgabe mit g bestimmt sie die Anzahl der signifikanten Stellen. Falls nötig wird gerundet. Ohne Angabe der Genauigkeit wird der Startwert 6 genommen. Bei Ganzzahlen bestimmt die Genauigkeitsangabe die Mindestzahl von Ziffern, die auszugeben sind. Besitzt eine Zahl weniger Ziffern, als Genauigkeit festlegt, so werden Nullen vorangestellt. Der Startwert für die Genaugigkeit ist hier 1. Ist das Argument ein String, so bestimmt die Genauigkeitsangabe die Höchstzahl der Zeichen, die vom String ausgegeben werden. typ legt fest, wie das entsprechende Argument interpretiert und umgewandelt werden soll. Hierbei muß typ mit dem Typ des Arguments korrespondieren . Folgende Typangaben sind möglich: typ Argument-Typ Ausgabe d,i int dezimal u unsigned int dezimal o unsigned int oktal x unsigned int hexadez. (a,b,c,d,e,f) X unsigned int hexadez. (A,B,C,D,E,F) f e,E g,G float/double float/double float/double typ c s Argument-Typ char / int String n int * p Zeiger % keiner Gleitkommazahl Exponentialdarst. Gleitkommazahl/Exponent., was kürzer ist. Ausgabe Einzelnes Zeichen Ausgabe bis \0 (abh. Genauigkeit) Speichert im entsprechenden Argument die Anzahl der bis dahin ausgegebenen Zeichen. Die im entsprechenden Argument enthaltene Adresse wird in hexadezimaler Form ausgegeben. Das Zeichen % wird ausgegeben. 206 KAPITEL 4. FUNKTIONEN Ist ein Argument vom Typ long, so muß den Typangaben d,i,u,o,x,X der Buchstabe l vorangestellt werden. Soll ein Argument vom Typ short interpretiert werden, so muß der Buchstabe h vorangestellt werden. Ein Argument vom Typ long double wird ausgegeben, indem den Typangaben f,e,E,g oder G ein L vorangestellt wird. Return-Wert: : Die Funktion liefert die Anzahl der ausgegebenen Zeichen, im Fehlerfall EOF zurück. Querverweis : cprint ecvt fprintf fread fscanf putc puts scanf sprintf vfprintf vprintf Beispiel : s.u. UNIX : Solaris 2.x / SunOS 4.1.x : wie oben 4.113. PRINTF() 207 Beispiel zur Funktion printf() #include <stdio.h> #include <string.h> #define I 555 #define R 5.5 int main(void) { int i,j,k,l; char buf[7],*prefix = buf,tp[20]; printf("Praefix 6d 6o 8x 10.2e "10.2f\n"); strcpy(prefix,"%"); for (i = 0; i < 2; i++) { for (j = 0; j < 2; j++) for (k = 0; k < 2; k++) for (l = 0; l < 2; l++) { if (i==0) strcat(prefix,"-"); if (j==0) strcat(prefix,"+"); if (k==0) strcat(prefix,"#"); if (l==0) strcat(prefix,"0"); printf("%5s |",prefix); strcpy(tp,prefix); strcat(tp,"6d |"); printf(tp,I); strcpy(tp,""); strcpy(tp,prefix); strcat(tp,"6o |"); printf(tp,I); strcpy(tp,""); strcpy(tp,prefix); strcat(tp,"8x |"); printf(tp,I); strcpy(tp,""); strcpy(tp,prefix); strcat(tp,"10.2e |"); printf(tp,R); strcpy(tp,prefix); strcat(tp,"10.2f |"); printf(tp,R); printf(" \n"); strcpy(prefix,"%"); } } return 0; } " 208 KAPITEL 4. FUNKTIONEN 4.114 putc(),putchar() Name : putc,putchar — gibt ein Zeichen aus. #include Benutzung : : <stdio.h> int putc(int c, FILE *fp); int putchar(int c); Prototyp in : <stdio.h> (ANSI) Beschreibung : putc() (put character) schreibt das Zeichen c auf die Datei, die mit dem File-Pointer fp verbunden ist. Das Makro putchar() ist identisch mit putc(int c, stdout), schreibt also ein Zeichen auf die Standardausgabe. Return-Wert: : Das ausgegebene Zeichen, im Fehlerfall EOF Querverweis : fprintf fputc fputch fputchar fputs fwrite getc getchar printf putch putchar putw vprintf Beispiel : s.u. UNIX : Solaris 2.x / SunOS 4.1.x : wie oben Beispiel zur Funktion putc() #include <stdio.h> int main(void) { char msg[] = "Hello world\n"; int i = 0; while (msg[i]) putc(msg[i++], stdout); return 0; } 4.115. PUTS() 4.115 209 puts() Name : puts — schreibt Zeichenkette auf Bildschirm. #include Benutzung : : <stdio.h> int puts(const char *string); Prototyp in : <stdio.h> (ANSI) Beschreibung : puts() (put string) schreibt den nullterminierten String string auf stdout und beendet die Ausgabe mit \n. Die Gegenfunktion zu puts() ist gets. Return-Wert: : Die Funktion liefert das letzte ausgegebene Zeichen (\n), im Fehlerfall wird EOF zurückgegeben. Querverweis : cputs fputs gets printf putchar Beispiel : s.u. UNIX : Solaris 2.x / SunOS 4.1.x wie oben Beispiel zur Funktion puts() #include <stdio.h> int main(void) { char string[] = "Das ist der String"; puts(string); puts(string); return 0; } 210 4.116 KAPITEL 4. FUNKTIONEN qsort() Name : qsort — sortiert n-Elemente in auf- und absteigender Reihenfolge. (ANSI) #include Benutzung : : <stdlib.h> void qsort(void *array, size t n, size t size, int (*compare)()); Prototyp in : <stdlib.h> Beschreibung : qsort() (quick-sort) sortiert die Elemente eines Arrays nach dem QuickSort-Algorithmus in auf und absteigender Reihenfolge. Die Elemente können dabei aus beliebigen Datenstrukturen bestehen. Argumentenliste: Argument array Bedeutung Zeiger auf das Element 0 des zu sortierenden Arrays n Anzahl der Elemente size Größe des Elementes (Byte) compare() Zeiger auf die Vergleichsfunktion Die Vergleichsfunktion muß für die ausfsteigende Sortierung folgenden Aufbau haben: *elem1 < *elem2 Rückgabewert < 0 *elem1 == *elem2 Rückgabewert = 0 *elem1 > *elem2 Rückgabewert > 0 Die Vergleichsfunktion muß für die absteigende Sortierung folgenden Aufbau haben: *elem1 < *elem2 Rückgabewert > 0 *elem1 == *elem2 Rückgabewert = 0 *elem1 > *elem2 Rückgabewert < 0 Return-Wert: : Die Funktion liefert das letzte ausgegebene Zeichen (\n), im Fehlerfall wird EOF zurückgegeben. Querverweis : cqsort fqsort gets printf putchar Beispiel : s.u. UNIX : Solaris 2.x : qsort(void *array, size t n, size t size, int(*compar)(const void *, const void *)) SunOS 4.1.x : wie oben 4.116. QSORT() Beispiel zur Funktion qsort() #include <stdio.h> #include <stdlib.h> #include <string.h> typedef int (*fcmp) (const void *, const void *); int sort_function(const char *a, const char *b); char list[5][4] = { "Bay", "Bar", "Bac", "Bau", "Bad" }; int main() { int x; qsort((void *)list, 5, sizeof(list[0]), (fcmp) sort_function); for (x = 0; x < 5; x++) printf("%s\n", list[x]); return 0; } int sort_function(const char *a, const char *b) { return( strcmp(a,b) ); } 211 212 4.117 KAPITEL 4. FUNKTIONEN raise() Name : raise — sendet Softwaresignal. #include Benutzung : : <signal.h> int raise(int sig); Prototyp in : <signal.h> Beschreibung : (ANSI) raise() (raise) sendet das Signal sig zum ausführenden Programm. Wurde mit der Funktion signal() eine Behandlungsroutine für die Signalnummer sig festgelegt, so wird diese ausgeführt. Ist keine Behandlungsroutine installiert, wird die Standardaktion für den jeweiligen Signaltyp ausgeführt. Folgende Signaltypen sind in signal.h definiert : Signal SIGARBRT SIGFPE SIGILL SIGINT Bedeutung Abnormal termination Bad floating poit operation Illegal instruction Control break interrupt SIGSEGV SIGTERM Invalid access to storage Request for program termination Standardaktion exit(3) exit(1) exit(1) Aufruf des Interrupts 0x23 exit(1) exit(1) Return-Wert: : Die Funktion liefert bei erfolgreicher Funktion den Wert 0, sonst einen verschiedenen Wert von 0. Querverweis : abort signal Beispiel : s.u. UNIX : Solaris 2.x : wie oben SunOS 4.1.x : nicht vorhanden 4.117. RAISE() Beispiel zur Funktion raise() #include <signal.h> int main() { int a, b; a = 10; b = 0; /* Division-durch-Null-Fehler vorbeugen */ if (b == 0) raise(SIGFPE); a = a / b; return 0; } 213 214 KAPITEL 4. FUNKTIONEN 4.118 rand() Name : rand — liefert eine Zufallszahl. #include Benutzung : : <stdlib.h> int rand(); Prototyp in : <stdlib.h> (ANSI) Beschreibung : rand() (random) erzeugt eine Zufallszahl zwischen 0 und RAND MAX. Die Konstante ist in stdlib.h definiert und hat mindestens den Wert 32767 = 215 − 1. Soll zum Programmstart eine neue Folge von Zufallszahlen erzeugt werden, muß der Zufallsgenerator mit srand() initialisiert werden. Return-Wert: : Die Funktion liefert die erzeugte Zufallszahl zurück. Querverweis : crand random randomize srand Beispiel : s.u. UNIX : Solaris 2.x / SunOS 4.1.x : wie oben Beispiel zur Funktion rand() #include <stdlib.h> #include <stdio.h> #include <time.h> int main(void) { int i; time_t timer; unsigned s; /* initialisiert den Zufallsgenerator mit der Systemzeit */ s = (unsigned) time(&timer); srand(s); printf("\n10 Zufallszahlen zwischen 0 und 99:\n"); for(i=0; i<10; i++) printf("%d ", rand() % 100); return 0; } 4.119. READ() 4.119 215 read() Name : read — liest Daten aus Datei. #include Benutzung : : <io.h> int read(int fd, void *buffer, unsigned n); Prototyp in : <io.h> Beschreibung : read() (read) liest n Bytes aus der mit mit dem File-Handle fd verbundenen Datei in den durch buffer angegebenen Speicherbereich. Wird die Datei im Modus text (DOS) eröffnet, dann entfernt read CRZeichen und interpretiert Ctrl-Z als Dateiende. Bei Diskettendateien beginnt der Lesevorgang ab der aktuellen Position. Bei Gerätedateien ist eine Position nicht definiert-es wird direkt vom Gerät gelesen. read kann max. 65534 Bytes lesen. Return-Wert: : Die Funktion liefert die tatsächlich eingelesenen Bytes als positive Integer zurück, wobei CR, Ctrl-Z nicht mitgezählt werden. Bei dem Versuch, ab Dateiende zu lesen wird der Wert 0 zurückgegeben. Im Fehlerfall ist der Return-Wert -1 und die Fehlervariable errno erhält folgende Werte: errno EACCES EBADF Bedeutung Zugriff nicht gestattet ungültiger File-Handle, Datei nicht offen Querverweis : fgetpos fseek fsetpos lseek rewind tell Beispiel : s.u. UNIX : Solaris 2.x : wie oben, Headerdatei ist <unistd.h> SunOS 4.1 x : wie oben, Headerdatei ist <unistd.h> 216 KAPITEL 4. FUNKTIONEN Beispiel zur Funktion read() #include #include #include #include #include #include <stdio.h> <io.h> <alloc.h> <fcntl.h> <process.h> <sys\stat.h> int main(void) { void *buf; int handle, bytes; buf = malloc(10); /* Sucht im aktuellen Directory nach einer Datei namens TEST.$$$ und versucht, 10 Bytes daraus zu lesen. Um das Beispiel auszuprobieren, sollten Sie die Datei TEST.$$$ anlegen. */ if ((handle = open("TEST.$$$", O_RDONLY | O_BINARY, S_IWRITE | S_IREAD)) == -1) { printf("Fehler beim Versuch, die Datei " "zu oeffnen!\n"); exit(1); } if ((bytes = read(handle, buf, 10)) == -1) { printf("Leseversuch misslungen.\n"); exit(1); } else { printf("read: %d Bytes gelesen.\n", bytes); } return 0; } 4.120. REALLOC() 4.120 realloc() Name : realloc — ändert die Größe des dynamischen Speicherblocks. (ANSI) #include Benutzung : : <io.h> void *realloc(void *ptr, size t n); Prototyp in : <stdlib.h>, <alloc.h> Beschreibung : realloc() (reallocate) verändert die Größe des durch ptr adressierten Speicherblocks, der zuvor mit malloc(), calloc() oder realloc reserviert wurde. n ist dabei die neue Länge des Speicherbereiches. Die Daten bleiben im reservierten Speicherbereich unverändert. Wird die Länge des Speicherbereichs vergrößert, so wird gegebenenfalls der gesamte Datenbereich kopiert. Return-Wert: : Die Funktion liefert einen typenlosen Zeiger auf den reservierten, zusammenhängenden Bereich zurück. Im Fehlerfall wird der NULLZeiger zurückgegeben. Querverweis : calloc free malloc Beispiel : s.u. UNIX : Solaris 2.x : wie oben, Headerdatei ist <stdlib.h> SunOS 4.1.x : wie oben, Headerdatei ist <malloc.h> 217 218 KAPITEL 4. FUNKTIONEN Beispiel zur Funktion realloc() #include <stdio.h> #include <alloc.h> #include <string.h> int main(void) { char *str; /* reserviert Speicher fuer den String */ str = malloc(10); /* kopiert "Hallo" in den String */ strcpy(str, "Hallo"); printf("Der String \"%s\" ist an Adresse " "%p gespeichert.\n", str, str); /* verdoppelt den Speicher fuer den String */ str = realloc(str, 20); printf("Der String \"%s\" ist jetzt an " "Adresse %p gespeichert.\n", str, str); /* gibt den Speicher fuer den String wieder frei */ free(str); return 0; } 4.121. REMOVE() 4.121 219 remove() Name : remove — löscht eine Datei. #include Benutzung : : <stdio.h> int remove(const char *filename); Prototyp in : <stdio.h> (ANSI) Beschreibung : remove() (remove) bewirkt, daß die Datei unter dem Dateinamen filename nicht mehr angesprochen werden kann. Gelöscht wird die Datei, wenn keine weiteren links mehr bestehen. filename kann einen vollständigen Suchweg und/oder Laufwerksbezeichner enthalten. Ein Directory oder eine schreibgeschützte Datei kann mit remove() nicht gelöscht werden. Return-Wert: : Die Funktion liefert den Wert 0 zurück, im Fehlerfall einen von 0 verschiedenen Wert. Im Fehlerfall erhält errno folgende Werte: errno Bedeutung ENOENT no such file or directory EACCES permission denied Querverweis : unlink Beispiel : s.u. UNIX : Solaris 2.x : wie oben SunOS 4.1 x : nicht vorhanden 220 KAPITEL 4. FUNKTIONEN Beispiel zur Funktion remove() #include <stdio.h> int main(void) { char file[80]; /* fragt nach dem Namen der zu loeschenden Datei */ printf("Zu loeschende Datei: "); gets(file); /* loescht die Datei */ if (remove(file) == 0) printf("%s geloescht.\n",file); else perror("Fehler bei remove()"); return 0; } 4.122. RENAME() 4.122 rename() Name : rename — ändert den Namen einer Datei von oldname auf newname. (ANSI) #include Benutzung : : <stdio.h> int rename(const char *altname, const char *neuname ); Prototyp in : <stdio.h> Beschreibung : rename() (rename) benennt den Dateinamen altname in den Dateinamen neuname um. Die Datei altname muß bereits vorhanden sein. Mit dieser Funktion kann die Eintragung in ein anderes Directory erfolgen, da hiermit kein Kopiervorgang verbunden ist. Return-Wert: : Konnte die Datei umbenannt werden, wird der Wert 0 zurückgegeben. Im Fehlerfall wird ein Wert verschieden von 0 zurückgegeben. Die Fehlervariable errno erhält EACCES (= permission denied), ENOENT (= no such file) oder EXDEV (= cross device link). Querverweis : Beispiel : s.u. UNIX : Solaris 2.x : wie oben SunOS 4.1.x : int rename(char *path1, char *path2); steht in keiner Headerdatei 221 222 KAPITEL 4. FUNKTIONEN Beispiel zur Funktion rename() #include <stdio.h> int main(void) { char oldname[80], newname[80]; /* fragt nach dem alten und dem neuen printf("Alter Name: "); Namen der Datei */ gets(oldname); printf("Neuer Name: "); gets(newname); /* benennt die Datei um */ if (rename(oldname, newname) == 0) printf("%s in %s umbenannt.\n", oldname, newname); else perror("Fehler bei rename()"); return 0; } 4.123. REWIND() 4.123 rewind() Name : rewind — setzt den Dateizeiger auf den Anfang der Datei. #include Benutzung : : <stdio.h> void rewind(FILE *fp); Prototyp in : <stdio.h> 223 (ANSI) Beschreibung : rewind() (rewind) setzt den Seek-Zeiger der mit dem File-Pointer fp verbundene Datei auf den Dateianfang zurück. Es wird das Dateiende -Flag sowie die gesetzten Fehlerflags gelöscht. rewind entpricht der Funktion fseek(fp,0l, 0) ohne Return-Wert. fseek() löscht die Fehlerflags nicht. Return-Wert: : Keiner Querverweis : fopen fseek ftell Beispiel : s.u. UNIX : Solaris 2.x / SunOS 4.1.x : wie oben 224 KAPITEL 4. FUNKTIONEN Beispiel zur Funktion rewind() #include <stdio.h> #include <dir.h> int main(void) { FILE *fp; char *fname = "TXXXXXX", *newname, first; /* erzeugt eine neue Datei fuer lesenden und schreibenden Zugriff */ newname = mktemp(fname); fp = fopen(newname,"w+"); /* schreibt einige Daten in die Datei */ fprintf(fp,"abcdefghijklmnopqrstuvwxyz"); /* positioniert auf den Dateianfang */ rewind(fp); /* liest ein Zeichen und gibt es aus */ fscanf(fp,"%c",&first); printf("Das erste Zeichen ist: %c\n",first); /* schliesst die Datei und loescht sie wieder */ fclose(fp); remove(newname); return 0; } 4.124. SCANF() 4.124 225 scanf() Name : scanf — liest formatierte Daten ein. #include Benutzung : : <stdio.h> int scanf(const char *formatstring, . . . , /* arg1 . . . argn */); Prototyp in : <stdio.h> Beschreibung : (ANSI) scanf() (scan formatted) liest Zeichen in formatierter Form von der Standardeingabe und speichert die konvertierten Werte in Variablen, die durch die Argumente arg1, . . . argn adressiert werden. scanf() ist die Gegenfunktion zu printf(). Die Interpretation der einzelnen Zeichen erfolgt durch den FormatString formatstring, der Formatelemente enthält. Für jedes Element muß ein Argument angegeben werden. Überzählige Argumente werden ignoriert. Ein Formatelement hat folgende allgemeine Form: %[Feldbreite] typ Für jedes Formatelement wird das nächste Eingabefeld gelesen, konvertiert und in die entsprechende Variable abgelegt. Eingabefelder sind durch Zwischenraumzeichen (Leer-, Tabulator- und NewlineZeichen) voneinander getrennt. Der * unterdrückt eine Zuweisung des korrespondierenden Parameters. Die Feldbreite legt die max. Zeichenzahl fest, aus der das Eingabefeld besteht. typ entspricht den Typangaben bei printf() mit folgenden Möglichkeiten : 226 KAPITEL 4. FUNKTIONEN typ d u o x i e,f,g E,F,G c s,[] Eingabe dezimale Ganzzahl positive dezimale Ganzzahl oktale Ganzzahl hexadezimale Ganzzahl dezimale, oktale oder hexadezimale Argument int-Zeiger unsigned-Zeiger unsigned-Zeiger unsigned-Zeiger int-Zeiger Gleitpunktzahl im Format einer Gleitpuntkonstanten einzelnes Zeichen String float-Zeiger p n Zeigerwert, hexadezimal keine % ein %-Zeichen char-Zeiger char-Zeiger auf den Anfang eines charVektors Zeiger auf void-Zeiger int-Zeiger. Es wird die Anzahl der bis dahin eingelesenen Zeichen gespeichert. keines • Bei %i entscheidet das Präfix wie bei ganzzahligen Konstanten über den Typ. • Den Typangaben d,i,o,x,u ist der Buchstabe l bzw. h voranzustellen, wenn das Argument die Adresse einer long- bzw. short- Variablen ist. • Den Typangaben e,f,g,E,F,G ist der Buchstabe l bzw. L voranzustellen, falls das Argument die Adresse einer double- bzw. longdouble Variablen ist. • %c bewirkt, daß das nächste Zeichen eingelesen wird. Dieses kann auch ein Zwischenraumzeichen sein. Im Gegensatz dazu lesen alle anderen Typangaben das nächste Eingabefeld, wobei führende whitespace-Zeichen (Zwischenraum-Zeichen) überlesen werden. Um whitespace- Zeichen zu überlesen und ein einzelnes Zeichen zu lesen sollte man die Anweisung %1s verwenden. • %Bc (B=Breite) - scanf() erwartet einen Zeiger auf ein char- Array mit B Elementen als Adreßparameter. • %s - es wird ein Zeiger auf ein char Array erwartet. Das Array Platz muß ein zusätzliches NULL- Zeichen bieten. 4.124. SCANF() 227 • %[Suchmenge] - es wird ein Zeiger auf ein char- Array erwartet (s. %s). Suchmenge ist eine Folge von Zeichen, aus denen die Eingabe bestehen muß. Für das invertierte Suchen kann das Zeichen ∧ eingesetzt werden. Beispiele: %[abc] Es werden nur die Eingaben der Zeichen a,b,c erlaubt. %[∧ abc] Es werden nur die Eingaben der Zeichen erlaubt, die nicht a,b,c sind. Das Eingabefeld wird durch ein Zeichen, das nicht zur Suchmenge gehört, beendet. Das whitespace- Zeichen beendet das Eingabefeld nicht. Bereichsdefinitionen %[0123456789] %[0-9] %[A-Z] %[A-Za-z] %[A-Za-zäöüÄÖÜß] Ziffern 0-9. Äquivalente Vereinbarung. Alle Großbuchstaben. Alle Groß- und Kleinbuchstaben. Alle Groß- und Kleinbuchstaben, Umlaute und das ß. Regeln zur Anwendung – Das Zeichen vor dem Bindestrich - muß einen ASCII-Code haben, der mindestens um eins niedriger ist als das auf dem Bindestrich folgende Zeichen. – Der Bindestrich darf weder das erste noch das letzte Zeichen der Aufzählung sein. – Das Zeichen vor und das Zeichen nach dem Bindestrich muß jeweils den Beginn bzw. das Ende eines Bereichs darstellen, dürfen also nicht gleichzeitig Beginn und Ende zweier verschiedener Bereiche sein. Weitere Bedeutung des Bindestrichs %[-+*/] %[z-a] %[+0-9-A-F] %[+0-9A-F-] %[∧ -0-9+A-F] die vier arithmetischen Operatoren. die Zeichen z,-,a. das Zeichen +, die Ziffern 0-9, das Zeichen -, die Buchstaben A-F. s. vorheriges Beispiel. sämtliche Zeichen außer -, den Ziffern 0-9, dem Zeichen + und Buchstaben A-F. 228 KAPITEL 4. FUNKTIONEN Ist ein Argument vom Typ long, so muß den Typangaben d,i,u,o,x,X der Buchstabe l vorangestellt werden. Soll ein Argument vom Typ short interpretiert werden, so muß der Buchstabe h vorangestellt werden. Ein Argument vom Typ long double wird ausgegeben, indem den Typangaben f,e,E,g oder G ein L vorangestellt wird. Return-Wert: : Die Funktion liefert die Anzahl der ausgegebenen Zeichen, im Fehlerfall EOF zurück. Querverweis : cprint ecvt fscanf fread fscanf putc puts scanf sscanf vfscanf vscanf Beispiel UNIX : : s.u. Solaris 2.x / SunOS 4.1.x : wie oben 4.124. SCANF() Beispiel zur Funktion scanf() #include <stdio.h> #include <conio.h> int main(void) { char label[20]; char name[20]; int entries = 0; int loop, age; double salary; struct Entry_struct { char name[20]; int age; float salary; } entry[20]; /* Einen bis zu 20 Zeichen langen String als Label eingeben */ printf("\n\nBitte geben Sie ein Label fuer " "die Tabelle ein: "); scanf("%20s", label); /* falls Falscheingabe Eingabestream loeschen */ fflush(stdin); /* Angabe der Anzahl von einzugebenden Zeichen als Integer */ printf("Wieviele Eintraege werden gemacht? " "(weniger als 20): "); scanf("%d", &entries); fflush(stdin); /* Eingabe eines Namens auf Gross- und Kleinbuchstaben beschraenken */ for (loop=0;loop<entries;++loop) { printf("\nEingabe %d\n", loop+1); printf(" Name : "); scanf("%[A-Za-z]", entry[loop].name); fflush(stdin); /* Eingabe einer Altersangabe als Integer */ printf(" Alter : "); scanf("%d", &entry[loop].age); fflush(stdin); 229 230 KAPITEL 4. FUNKTIONEN /* Eingabe eines Gehalts als Fliesskommazahl */ printf(" Gehalt : "); scanf("%f", &entry[loop].salary); fflush(stdin); } /* Eingabe von Name, Alter und Gehalt als String, Integer und Double */ printf("\nGeben Sie bitte Ihren Namen, Ihr " "Alter und Ihr Gehalt ein:\n"); scanf("%20s %d %lf", name, &age, &salary); /* Druckt die Daten, die eingegeben wurden */ printf("\n\nTabelle: %s.\n",label); printf("Zusammengestellt von %s, %d Jahre " "alt; %10.2lf DM schwer:\n", name, age, salary); printf("-----------------------------------" "------------------\n"); for (loop=0;loop<entries;++loop) printf("%4d | %-20s | %5d | %15.2lf\n", loop + 1, entry[loop].name, entry[loop].age, entry[loop].salary); printf("-----------------------------------" "------------------\n"); return 0; } 4.125. SETBUF() 231 4.125 setbuf() Name : setbuf — explizite Pufferzuordnung. #include Benutzung : : <stdio.h> void setbuf(FILE *fp, char *buffer); Prototyp in : <stdio.h> (ANSI) Beschreibung : setbuf() (set buffer) ordnet dem mit dem File-Handle fd verbundenen Datei den Dateipuffer buffer ein, der die Länge BUFSIZ (defin. in stdio.h) haben muß. Falls buffer ein NULL-Zeiger ist, erfolgt die Dateiein-/ausgabe ungepuffert. stdin und stdout arbeiten ungepuffert, wenn sie nicht umgeleitet sind. Umleitungen bewirken in der Regel eine Pufferung, die durch setbuf verändert werden kann. Pufferung : bedeutet, Ausgaben werden zeichenweise zwischengespeichert; Eingaben werden blockweise von der Datei bzw. Gerät gelesen und danach zeichenweise aus dem Puffer geliefert. Return-Wert: : Keiner Querverweis : fflush fopen fseek setvbuf Beispiel : s.u. UNIX : Solaris 2.x / SunOS 4.1.x : wie oben 232 KAPITEL 4. FUNKTIONEN Beispiel zur Funktion setbuf() #include <stdio.h> /* BUFSIZ wird in stdio.h definiert */ char outbuf[BUFSIZ]; int main(void) { int i; /* ordnet der Standardausgabe einen Puffer zu */ setbuf(stdout, outbuf); /* schreibt einige Zeichen in den Puffer */ puts("Das ist ein Test fuer gepufferte " "Ausgabe.\n"); puts("Diese Ausgabe wird in outbuf " "geschrieben"); puts("und tritt erst dann in Erscheinung,wenn"); puts("der Puffer voll oder der Stream "); puts("geflusht wird."); getch(); /* leert Ausgabepuffer */ fflush(stdout); getch(); return 0; } 4.126. SETJMP() 233 4.126 setjmp() Name : setjmp — speichert die stack - Umgebung. #include Benutzung : : <setjmp.h> int setjmp(jmp buf env); Prototyp in : <setjmp.h> (ANSI) Beschreibung : setjmp() (set jump) speichert den momentanen Maschinenzustand und die Stack-Umgebung in den durch env angegebenen Puffer. Durch einen späteren Aufruf der Funktion longjmp() wird dieser alte Zustand wiederhergestellt und die Programmausführung hinter dem Aufruf von setjmp() fortgesetzt, wobei der Return-Wert von setjmp() verändert wird. Return-Wert: : Die Funktion liefert den Wert 0 zurück. Bei einem Rücksprung mit longjmp() wird dieser auf einen von 0 verschiedenen Wert gesetzt. Querverweis : longjmp signal Beispiel : s.u. UNIX : Solaris 2.x / SunOS 4.1.x : wie oben 234 KAPITEL 4. FUNKTIONEN Beispiel zur Funktion setjmp() #include <stdio.h> #include <setjmp.h> #include <process.h> jmp_buf jumper; void subroutine(void); int main(void) { int value; /* value erhaelt von setjmp den Wert 0 */ value = setjmp(jumper); /* longjmp nimmt das Programm an dieser Stelle wieder auf und weist value einen Wert != 0 zu */ if (value != 0) { printf("Longjmp() lieferte den Wert " "%d\n", value); exit (value); } printf("Es folgt der Aufruf von " "subroutine() ... \n"); subroutine(); return 0; } void subroutine(void) { longjmp(jumper,1); } 4.127. SETVBUF() 4.127 235 setvbuf() Name : setvbuf — explizite variable Pufferzuordnung. #include Benutzung : : <stdio.h> int setvbuf(FILE *fp, char *buffer, int mode, size t size); Prototyp in : <stdio.h> Beschreibung : (ANSI) setvbuf() (set variable buffer) ordnet der mit dem File-Handle fd verbundenen Datei der Länge size anstelle des standardmäßigen Dateipuffer zu. Das Argument mode ist eine der folgenden in stdio.h definierten Konstanten: mode IOFBF Bedeutung I/O fully buffered: Ein-und Ausgaben werden vollständig gepuffert. IOLBF I/O line buffered : Ausgaben werden zeilenweise gepuffert, d.h. nach jedem Zeilenvorschub wird der Pufferinhalt in die Datei geschrieben. Eingaben werden wie bei IOFBF vollständig gepuffert. IONBF I/O not buffered : Ein-und Ausgaben erfolgen ungepuffert. buffer und size werden ignoriert. Falls buffer ein NULL-Zeiger ist, so wird durch einen Aufruf von malloc() ein Puffer der Größe size dynamisch angelegt. Return-Wert: : Die Funktion gibt den Wert 0, im Fehlerfall einen von 0 verschiedenen Wert. Querverweis : fflush fopen setbuf Beispiel : s.u. UNIX : Solaris 2.x / SunOS 4.1.x : wie oben 236 KAPITEL 4. FUNKTIONEN Beispiel zur Funktion setvbuf() #include <stdio.h> int main(void) { FILE *input, *output; char bufr[512]; input = fopen("Datei.ein", "r+b"); output = fopen("Datei.aus", "w"); /* richtet fuer minimalen Diskettenzugriff einen vollstaendig gepufferten Eingabestream ein (funktioniert nur, wenn datei.ein erfolgreich geoeffnet werden konnte) */ printf("Puffer fuer Eingabedatei konnte " "%sangelegt werden.\n", setvbuf(input, bufr, _IOFBF, 512) ? "nicht " : ""); /* Ausgabestream wird zeilenweise gepuffert, wobei Speicher durch einen indirekten Aufruf von malloc zugeordnet wird */ printf("Puffer fuer Ausgabedatei konnte " "%sangelegt werden.\n", setvbuf(output, NULL, _IOLBF, 132) ? /* Hier findet die Datei Ein-/Ausgabe statt ... */ /* Dateien schliessen */ fclose(input); fclose(output); return 0; } "nicht " : ""); 4.128. SIGNAL() 237 4.128 signal() Name : signal — Signalverarbeitung. #include Benutzung : : <signal.h> void signal(*signal( int sig, void (*func)(int)))(int); Prototyp in : <signal.h> Beschreibung : (ANSI) signal() (signal) ermöglicht die Festlegung, wie ein Programm auf Signale mit der Signalnummer sig reagiert. Signale werden entweder durch andere Prozesse, von der Tastatur, durch interne Interrupts, wie z.B. Division durch Null, oder explizit mit der Funktion raise() erzeugt. Das Argument func legt die Art der Reaktion fest: func SIG DFL Wirkung beim Eintreffen des Signals sig signal default.Die Standardroutine für die Signalnummer wird aufgerufen. Danach wird im allgemeinen das Programm beendet. SIG IGN signal ignore. Das Signal wird ignoriert und das Programm fortgesetzt. Adresse einer Zuerst wird signal(sig,SIG DFL) und dann Funktion die Funktion (*func)(sig) aufgerufen. Es wird also für das nächste Signal sig die Standardroutine eingesetzt und dann die eigentliche Reaktion auf das momentane Signal ausgeführt. Soll beim nächsten Signal sig nicht die Standardroutine ausgeführt werden, so muß wieder signal() aufgerufen werden, z.B. in der Funktion (*func)() selbst. Signal Bedeutung SIGABRT abort, abnormale Programmbeendigung, z.B. durch die Funktion abort() ausgelöst. Standardmäßig wird das Programm beendet. SIGFPE floating point exception, ausgelöst durch Divisionsfehler, Coprozessor-bzw. Emulator-Fehler. SIGILL illegal instruction, ausgelöst durch ungültigen Maschinenbefehl. SIGINT interrupt, ausgelöst durch das Drücken der Unterbrechungstaste (DOS: Ctrl-C). SIGSEGV segmentation violation, ausgelöst durch einen ungültigen Speicherzugriff. SIGTERM termination, Software-Beendigung des Programms) (UNIX: Standardsignal des Kill-Kommandos). 238 KAPITEL 4. FUNKTIONEN Return-Wert: : Die Funktion liefert bei erfolgreicher Ausführung den Wert von func aus dem vorhergehenden Aufruf von signal(),also den vorhergehenden Reaktionseintrag. Beim ersten Aufruf ist das SIG DFL. Trat ein Fehler auf, wird der Fehlercode SIG ERR zurückgegeben und die Fehlervariable errno erhält den Wert EINVAL. Querverweis : fflush fopen signal Beispiel : s.u. UNIX : Solaris 2.x : wie oben SunOS 4.1.x : void(*signal())(); 4.128. SIGNAL() Beispiel zur Funktion signal() (für DOS) /* Dieses Beispiel installiert eine SignalHandlerroutine fuer SIGFPE, faengt eine Integerueberlaufbedingung ab, bereinigt das AX-Register und kehrt zurueck. Je nach verwendetem Speichermodell KOENNTE dieses Beispiel zu einem Systemabsturz fuehren oder Laufzeitfehler erzeugen. */ #pragma inline #include <stdio.h> #include <signal.h> void Catcher(int *reglist) { printf("Gefasst!\n"); /* liefert 3 in AX zurueck */ *(reglist + 8) = 3; } int main(void) { signal(SIGFPE, Catcher); /* AX = 32767 */ asm mov ax,07FFFH /* verursacht einen ueberlauf */ asm inc ax /* aktiviert den Handler */ asm into /* Der Handler gab in AX 3 zurueck. Ansonsten wuerde das naechste into nach der decAnweisung eine weiter Ausnahmebedingung ausloesen. */ /* kein ueberlauf mehr */ asm dec ax /* Handler wird nicht mehr aktiviert */ asm into return 0; } 239 240 KAPITEL 4. FUNKTIONEN 4.129 sin() Name : #include : Benutzung : Prototyp in : sin — berechnet den Sinus des Argumentes x. (ANSI) <math.h> (reel) <complex.h> (complex) double sin(double x); complex sin(complex x); <math.h> (reel) <complex.h> (complex) Beschreibung : sin() (sine) berechnet den Sinus des Argumentes x. Der Wert von x wird als Bogenmaß interpretiert. Das Argument x wird durch Modulodivision in den Bereich 0 bis 2*pi transformiert, wobei pi = 3.1415927... ist. Ist der Absolutwert des Argumentes sehr groß, so kann daraus eine zu große Ungenauigkeit für das Ergebnis entstehen. Return-Wert: : Die Funktion gibt den Sinus von x im Bogenmaß zurück. Der Wert liegt im Bereich von -1 und +1. Im Fehlerfall, wenn der Argumentwert zu groß für ein signifikantes Ergebnis ist, wird der Wert 0 zurückgegeben. Es wird eine Fehlermeldung auf stderr ausgegeben, und die Fehler- variable errno erhält den Wert EDOM (= domain error). Fehlerbehandlung kann ev. unter Verwendung der Funktion matherr geändert werden. Querverweis : acos asin atan atan2 complex asin complex sin atan sinh tan Beispiel : double pi = 3.1415927; printf(“sin(0.0) = %4.1f\n“,sin(0.0)); printf(“sin(pi/2) = %4.1f\n“,sin(pi/2)); printf(“sin(3/2*pi) = %4.1f\n“,sin(3/2*pi)); Ergebnis : sin(0.0) = 0.0000 sin(pi/2) = 1.0000 sin(3/2*pi) = -1.0000 UNIX : Solaris 2.x / SunOS 4.1.x : wie oben, aber nur für reele Zahlen 4.129. SIN() Beispiel zur Funktion sin() #include <stdio.h> #include <math.h> int main(void) { printf("Der Sinus von %lf ist %lf\n", 0.5, sin(0.5)); return 0; } 241 242 4.130 KAPITEL 4. FUNKTIONEN sinh() Name : #include : Benutzung : Prototyp in : sinh — berechnet den Sinus Hyperbolicus des Argumentes x. (ANSI) <math.h> (reel) <complex.h> (complex) double sinh(double x); complex sinh(complex x); <math.h> (reel) <complex.h> (complex) Beschreibung : sinh() (hyperbolic sin) berechnet den Sinus Hyperbolicus des Argumentes x. Return-Wert: : Die Funktion gibt den Sinus Hyperbolicus von x im Bogenmaß zurück. Ist das Ergebnis zu groß, so wird HUGE VAL zurückgegeben und die Fehlervariable errno erhält den Wert ERANGE (=range error). Querverweis : acos atan2 matherr tan asin complex sin tanh atan cos cosh Beispiel : printf(“sinh(-5.0) = %8.4f\n“,sinh(-5.0)); printf(“sinh(0.0) = %8.4f\n“,sinh(0.0)); printf(“sinh(5.0) = %8.4f\n“,sinh(5.0)); Ergebnis : sinh(-5.0) = -74.2032 sinh(0.0) = 0.0000 sinh(5.0) = 74.2032 UNIX : Solaris 2.x / SunOS 4.1.x : wie oben, aber nur für reele Zahlen Beispiel zur Funktion sinh() #include <stdio.h> #include <math.h> int main(void) { printf("Der Sinus hyperbolicus von %lf ist %lf\n", 0.5, sinh(0.5)); return 0; } 4.131. SPAWN...() 4.131 spawn...() Name : #include : Benutzung : Prototyp in : Beschreibung : spawn... — Funktionen zur Erzeugung und Ausführung untergeordneter Prozesse. <process.h> <stdio.h> int spawnl(int mode, char *path, char *arg0, /* arg1...argn, NULL */); int spawnle(int mode, char *path, char *arg0, /* arg1...argn, NULL, char envp[] */); int spawnlp(int mode, char *path, char *arg0, /* arg1...argn, NULL */); int spawnlpe(int mode, char *path, char *arg0, /* arg1...argn, NULL, char envp[] */); int spawnv(int mode, char *path, char *argv[]); int spawnve(int mode, char *path, char *argv[], char *envp[]); int spawnvp(int mode, char *path, char *argv[]); int spawnvpe(int mode, char *path, char *argv[], char *envp[]); <process.h> Die Funktionen spawn...- Familie erzeugen und führen andere Programme aus, die auch untergeordnete Processe genant werden. Es muß ausreichend Speicherplatz für das Laden und Ausführen dieser Prozesse vorhanden sein. Das aufrufende Programm (parent) bleibt während der Ausführung des neu gestarteten Prozesses (child) im Speicher und wird nach dem Ablauf des untergeordneten Prozesses fortgesetzt. Der Wert des Parameters mode legt fest, wie sich der übergeordnete Prozeß während der Ausführung des untergeordneten Prozesses verhält. Die folgenden Konstanten sind in process.h definiert: P WAIT - Der übergeordnete Prozeß bleibt im Speicher, wird aber für die Dauer der Ausführung des untergeordneten Prozesses stillgelegt. P NOWAIT - Über-und untergeordnete Prozesse werden konkurrierend ausgeführt. P OVERLAY - Der übergeordnete Prozeß wird vom untergeordneten überschrieben und nach dessen Beendigung nicht fortgesetzt (derselbe Ablauf wie bei exec...). Hinweis: P NOWAIT ist gegenwärtig nicht verfügbar; die Verwendung erzeugt einen Fehler. 243 244 KAPITEL 4. FUNKTIONEN Der Parameter path gibt den Namen des untergeordneten Prozesses an. Verwendet wird der Standard-Suchalgorithmus von DOS: Wenn weder eine Namenserweiterung oder ein Punkt angegeben ist, wird zuerst nach Dateien ohne Erweiterung, dann nach .COM-Dateien und anschließend nach .EXE-Dateien gesucht. Wenn eine Namenserweiterung oder ein Punkt angegeben ist, wird nur nach dem angegebenen Dateinamen gesucht. Bei der Angabe xxx. sucht DOS nach der Datei XXX, bei der Angabe xxx.yyy nach der Datei XXX.YYY. Die p-Varianten von spawn... suchen im aktuellen Verzeichnis, danach in sämtlichen Verzeichnissen, die durch PATH festgelegt sind. Die Varianten ohne p suchen nur innerhalb des aktuellen Verzeichnisses. Die einzelnen Funktionen der spawn...-Familie unterscheiden sich durch die Namensendungen l,v,p und e, wobei jeder dieser Buchstaben für andere Fähigkeiten steht. Es bedeuten: p PATH - die spawn-Funktion sucht nach dem untergeordneten Prozeß nicht nur innerhalb des aktuellen Verzeichnisses, sondern auch in sämtlichen durch PATH festgelegten Verzeichnissen. l LIST - die Kommandozeilenparameter werden an den untergeordneten Prozeß in Form einer Liste einzelner Argumente übergeben, also als arg0, arg1, ... argn. Die Listenform wird normalerweise verwendet, wenn die Zahl der Parameter bekannt (und konstant) ist. v VARIABLE - die Kommandozeilen-Parameter werden an den untergeordneten Prozeß in Form von Zeiger-Arrays übergeben, d.h. als argv[0], argv[1] ...argv[n]. Diese Form wird normalerweise bei variablen Parameterzahlen verwendet. 4.131. SPAWN...() e ENVIRONMENT - erlaubt die Übergabe des Zeiger-Array envp (d.h. eines eigenen Environment für den untergeordneten Prozeß). Ein über die spawn...-Varianten ohne e aufgerufener untergeordneter Prozeß verwendet dieselben Umgebungsparameter wie das aufrufende Programm. Jede Funktion der spawn-Familie enthält entweder ein l oder v im Namen, die weiteren Kombinationen mit p und e sind optional. Zwei Beispiele dazu: spawnl verwendet eine Liste von Argumenten, sucht nur das aktuelle Verzeichnis nach dem untergeordneten Prozeß ab und übergibt die Environment-Parameter, die auch für das aktuell laufende Programm gültig sind. spawnvpe übergibt die Kommandozeilenparameter als Zeiger-Array, führt nötigenfalls eine Suche nach dem untergeordneten Prozeß über die mit PATH gesetzten Suchwege aus und übergibt EnvironmentParameter, die vom Programmierer definiert wurden. Sämtliche spawn... - Funktionen müssen mindestens ein Argument an den untergeordneten Prozeß übergeben, nämlich arg0 bzw. arg[0]. Das erste Argument enthält per Konvention den Pfadnamen des untergeordneten Prozesses. Die Übergabe anderer Daten als erstem Argument erzeugt jedoch keinen Fehler. Zur Übergabe einer leeren Argumentliste an den untergeordneten Prozeß muß arg0 bzw. arg[0] NULL sein. Der path-Wert von arg0 bzw. arg[0] ist nur unter den DOS-Versionen ab 3.0 für den untergeordneten Prozeß verfügbar. Bei Verwendung der l-Funktionen zeigt arg0 normalerweise auf denselben String wie path, arg1,...,argn zeigen auf weitere Strings, die Argumentenliste wird durch ein (obligatorisches!) NULL beendet. Die e-Funktionen erwarten ein Zeiger-Array als Argument, dessen Inhalt als *envp[] übergeben wird. Jedes Element dieses Array ist ein nulltermienierter String der Form envvar = Wert wobei envvar der Name der Environment-Variablen und Wert der String-Wert ist, auf den envvar gesetzt wird. Das letzte Element des Array muß einen Zeiger mit dem Wert NULL enthalten. Dadurch wird das Listenende gekennzeichnet. Wenn env[0] den Wert NULL hat, verwendet der untergeordnete Prozeß die Environment-Tabelle des übergeordneten Prozesses. Die Gesamtlänge sämtlicher als arg übergebener Kommandozeilenparameter darf 127 Byte nicht überschreiten (inklusive der automatisch eingesetzten Leerzeichen zur Trennung einzelner Parameter). Nullzeichen werden bei dieser Zählung nicht berücksichtigt. spawn... schließt keine Dateien-durch den übergeordneten Prozeß geöffnete Dateien stehen auch dem untergeordneten Prozeß zur Verfügung. 245 246 KAPITEL 4. FUNKTIONEN Return-Wert: : Die fehlerfreie Ausführung einer spawn...-Funktion hat den Exit-Code des untergeordneten Prozesses als Rückgabewert. Der Exit-Code eines Programms kann über exit, exit, abort usw. spezifisch festgelegt werden - normalerweise steht der Wert 0 für erfolgreich ausgeführt. Konnte die spawn...-Funktion dagegen nicht ausgeführt werden, dann wird -1 zurückgeliefert, und errno bekommt einen der folgenden Werte: Wert E2BIG EINVAL ENOENT ENOEXEC ENOMEM Bedeutung Argumentenliste zu lang Ungültiger Wert für mode Suchweg/Dateiname nicht gefunden exec-Formatfehler Nicht genug Platz im Hauptspeicher Querverweis : abort atexit exit exit exec... fpreset searchpath system Beispiel : s.u. UNIX : Solaris 2.x / SunOS 4.1.x : nicht vorhanden 4.131. SPAWN...() Beispiel zur Funktion spawnl() #include <process.h> #include <stdio.h> #include <conio.h> void spawnl_example(void) { int result; clrscr(); result = spawnl(P_WAIT, "bcc.exe", NULL); if (result == -1) { perror("Error from spawnl"); exit(1); } } void spawnle_example(void) { int result; clrscr(); result = spawnle(P_WAIT, "bcc.exe", NULL, NULL); if (result == -1) { perror("Error from spawnle"); exit(1); } } int main(void) { spawnl_example(); spawnle_example(); return 0; } 247 248 KAPITEL 4. FUNKTIONEN Beispiel zur Funktion spawnlp() /* spawnlp example */ #include <process.h> #include <stdio.h> #include <errno.h> void main(int argc, char *argv[]) { int i; printf("Command line arguments:\n"); for (i=0; i<argc; ++i) printf("[%2d] : %s\n", i, argv[i]); printf("About to exec child with arg1 arg2 ...\n"); spawnlp(P_WAIT, "C:\BORLANDC\BIN\BCC.EXE", argv[1], argv[2], NULL); perror("exec error"); exit(1); } Beispiel zur Funktion spawnlpe() /* spawnlpe example */ #include <process.h> #include <stdio.h> #include <errno.h> int main( int argc, char *argv[], char **envp ) { int i; printf("Command line arguments:\n"); for (i=0; i < argc; ++i) printf("[%2d] %s\n", i, argv[i]); printf("About to exec child with arg1 arg2 ...\n"); spawnlpe(P_WAIT, "C:\BORLANDC\BIN\BCC.EXE", argv[1], argv[2], NULL, envp); perror("exec error"); exit(1); return 0; } 4.131. SPAWN...() Beispiel zur Funktion spawnv() /* spawnv example */ #include <process.h> #include <stdio.h> #include <errno.h> void main(int argc, char *argv[]) { int i; printf("Command line arguments:\n"); for (i=0; i<argc; ++i) printf("[%2d] : %s\n", i, argv[i]); printf("About to exec child with arg1 arg2 ...\n"); spawnv(P_WAIT,"C:\BORLANDC\BIN\BCC.EXE", argv); perror("exec error"); exit(1); } Beispiel zur Funktion spawnve() /* spawnve example */ #include <process.h> #include <stdio.h> #include <errno.h> void main(int argc, char *argv[], char **envp) { int i; printf("Command line arguments:\n"); for (i=0; i<argc; ++i) printf("[%2d] : %s\n", i, argv[i]); printf("About to exec child with arg1 arg2 ...\n"); spawnve(P_WAIT, "C:\BORLANDC\BIN\TDMEM.EXE", argv, envp); perror("exec error"); exit(1); } 249 250 KAPITEL 4. FUNKTIONEN Beispiel zur Funktion spawnvp() /* spawnvp example */ #include <process.h> #include <stdio.h> #include <errno.h> void main(int argc, char *argv[]) { int i; printf("Command line arguments:\n"); for (i=0; i<argc; ++i) printf("[%2d] : %s\n", i, argv[i]); printf("About to exec child with arg1 arg2 ...\n"); spawnvp(P_WAIT, "C:\BORLANDC\BIN\BCC.EXE", argv); perror("exec error"); exit(1); } Beispiel zur Funktion spawnvpe() /* spawnvpe example */ #include <process.h> #include <stdio.h> #include <errno.h> int main( int argc, char *argv[], char **envp ) { int i; printf("Command line arguments:\n"); for (i=0; i < argc; ++i) printf("[%2d] %s\n", i, argv[i]); printf("About to exec child with arg1 arg2 ...\n"); spawnvpe(P_WAIT, "C:\BORLANDC\BIN\BCC.EXE", argv, envp); perror("exec error"); exit(1); return 0; } 4.132. SPRINTF() 4.132 sprintf() Name : sprintf — formatierte Ausgabe in einen String. #include Benutzung : : <stdio.h> int sprintf(const char *string, const char *formatstring, . . . /* arg1 . . . argn */); Prototyp in : <stdio.h> 251 (ANSI) Beschreibung : sprintf() (string print formatted) kopiert den Format-String formatstring mit den Werten der Argumentliste arg1, . . . argn formatiert in den String string. An dem durch string adressierten char-Vektor wird \0 angehängt. Return-Wert: : Die Funktion gibt die Anzahl der Zeichen zurück (ohne StringEndezeichen), die in den String kopiert werden. Querverweis : fprintf printf Beispiel : s.u. UNIX : Solaris 2.x / SunOS 4.1.x : wie oben Beispiel zur Funktion sprintf() #include <stdio.h> #include <math.h> int main(void) { char buffer[80]; sprintf(buffer, "%f ist eine Annaeherung " "von Pi", M_PI); puts(buffer); return 0; } 252 KAPITEL 4. FUNKTIONEN 4.133 sqrt() Name : #include : Benutzung : Prototyp in : sqrt — berechnet die Quadratwurzel des Argumentes x. (ANSI) <math.h> (reel) <complex.h> (complex) double sqrt(double x); complex sqrt(complex x); <math.h> (reel) <complex.h> (complex) Beschreibung : sqrt() (square root) berechnet die Quadratwurzel des Argumentes x. Der Wert von x darf nicht negativ sein. Return-Wert: : Die Funktion gibt den Wert der Quadratwurzel zurück. Ist das Argument x negativ, wird der Wert 0 zurückgegeben und die Fehlervariable errno erhält den Wert ERANGE (= range error). Querverweis : complex exp log pow Beispiel : s.u. UNIX : Solaris 2.x / SunOS 4.1.x : wie oben, aber nur für reele Zahlen Beispiel zur Funktion sqrt() #include <math.h> #include <stdio.h> int main(void) { double x = 4.5, result; result = sqrt(x); printf("Die Quadratwurzel von %lf ist %lf\n", x, result); return 0; } 4.134. SRAND() 253 4.134 srand() Name : srand — initialisiert Zufallsgenerator. #include Benutzung : : <stdlib.h> void srand(unsigned n); Prototyp in : <stdlib.h> (ANSI) Beschreibung : srand() (seed random) initialisiert den Zufallsgenerator mit dem Wert n. Mit rand() kann dann eine neue Folge von Zufallszahlen ermittelt werden. Erfolgt der Aufruf srand(1), so erzeugt rand() dieselbe Folge von Zufallszahlen, die auch ohne Aufruf von srand() enstanden wäre. Return-Wert: : Keiner Querverweis : rand random randomize Beispiel : s.u. UNIX : Solaris 2.x : wie oben SunOS 4.1.x : void srand(int n); 254 KAPITEL 4. FUNKTIONEN Beispiel zur Funktion srand() #include <stdlib.h> #include <stdio.h> int main(void) { #include <time.h> int main(void) { int i; unsigned s; time_t timer; /* initialisiert den Zufallsgenerator mit der Systemzeit */ s = (unsigned) time(&timer); srand(s); printf("\n10 Zufallszahlen zwischen 0 " "und 99:\n"); for(i=0; i<10; i++) printf("%d ", rand() % 100); /* noch einmal dieselben Zufallszahlen */ srand(s); printf("\nund noch einmal:\n"); for(i=0; i<10; i++) printf("%d ", rand() % 100); return 0; } 4.135. SSCANF() 255 4.135 sscanf() Name : sscanf — liest eine formatierte Eingabe. #include Benutzung : : <stdio.h> int sscanf(const char *string, const char *formatstring, . . . /* arg1 . . . argn */); Prototyp in : <stdio.h> (ANSI) Beschreibung : sscanf() (string scan formatted) liest und konvertiert Daten aus der Zeichenkette string und schreibt sie in die durch arg1, . . . , argn adressierten Speicherplätze. Die Funktion ist äquivalent zur Funktion scanf() mit dem Unterschied, daß anstatt von stdin aus dem durch string adressierten String gelesen wird. Return-Wert: : Die Funktion gibt die Anzahl der tatsächlich übertragenen Eingabefelder zurück. Bei einem Lesefehler wird der Wert -1 zuückgegeben. Wird vor der ersten Konvertierung das String-Endezeichen erreicht, wird EOF zurückgegeben. Querverweis : fscanf scanf Beispiel : s.u. UNIX : Solaris 2.x / SunOS 4.1.x : wie oben Beispiel zur Funktion sscanf() #include <stdio.h> char buffer[] = "a 3.14159 12 zwei Strings\n"; int main(void) { char ch; float f; int i; char s1[10], s2[10]; sscanf(buffer, "%c %f %d %s %s", &ch, &f, &i, s1, s2); printf("%c %f %d %s %s\n", ch, f, i, s1, s2); return 0; 256 } KAPITEL 4. FUNKTIONEN 4.136. STAT() 4.136 257 stat() Name : stat — ermittelt Status-Informationen einer Datei. #include Benutzung : : <sys\stat.h> int stat(char *file, struct stat *buffer); Prototyp in : <sys\stat.h> Beschreibung : stat() (status) ermittelt Status-Informationen der durch file verbundenen Datei und speichert das Ergebnis in durch buffer adressierten Struktur vom Type stat. Die Funktion steht auf UNIX, DOS- und OS/2- Maschinen zur Verfügung und ist auch auf Directories anwendbar. Die Struktur stat ist wie folgt definiert: struct { }; cat short st dev; unsigned short unsigned short short short short short long st st st st st st st long st atime; long st mtime; long st ctime; ino; mode; nlink; uid; gid; rdev; size; /* Nummer des Laufwerks, das die Datei enthält */ /* Nur UNIX: I-Knotennummer */ /* Der 16-Bit Dateimodus */ /* Link-Zähler, unter DOS: 1 */ /* Nur UNIX: User-ID */ /* Nur UNIX: Group-ID */ /* Für Gerätedateien */ /* Dateigröße in Bytes, 0 für Gerätedateien */ /* access time- Zeit des letzten Zugriffs, unter DOS: st atime = st mtime /* modification time - Zeit der letzten Schreiboperation */ /* status change time -Zeit der letzten Statusänderung (Lesen ist keine Statusänd. */ 258 KAPITEL 4. FUNKTIONEN Die Komponente st mode enthält mehrere Einzelinformationen, die in sys\stat.h als Bit-Konstanten vereinbart sind. Eines der beiden folgenden Bits ist gesetzt: Bit-Konstante S IFREG S IFDIR Bedeutung gesetzt, wenn es sich um eine normale Datei handelt, gesetzt, wenn file ein Verzeichnis angibt. Eines oder beide der folgenden Bits sind gesetzt: Bit-Konstante S IWRITE S IREAD Bedeutung gesetzt, wenn die Datei nicht gegen Schreiben gesperrt ist, gesetzt, wenn die Datei nicht gegen Lesen gesperrt ist. Return-Wert: : Die Funktion liefert den Wert 0, wenn Statusinformationen ermittelt werden konnten. Im Fehlerfall wird -1 zurückgegeben, wobei die Fehlervariable errno den Wert ENOENT (= no such file or directory) enthält. Querverweis : access chmod fstat Beispiel : s.u. UNIX : Solaris 2.x : int stat(const char *file, struct stat *buf); SunOS 4.1.x : wie oben 4.136. STAT() 259 Beispiel zur Funktion stat() #include <sys\stat.h> #include <stdio.h> #include <time.h> #define FILENAME "TEST.$$$" int main(void) { struct stat statbuf; FILE *stream; /* oeffnet eine Datei fuer schreibenden Zugriff */ if ((stream = fopen(FILENAME, "w")) == NULL) { fprintf(stderr, "Fehler beim Oeffnen der Datei.\n"); return(1); } /* schreibt einige Daten in die Datei und schliesst sie wieder */ fprintf(stream, "0123456789"); fclose(stream); /* ermittelt Informationen ueber die Datei */ stat(FILENAME, &statbuf); /* zeigt die Informationen an */ if (statbuf.st_mode & S_IFCHR) printf("Der Name bezeichnet eine logische Geraeteeinheit.\n"); if (statbuf.st_mode & S_IFREG) printf("Der Name bezeichnet eine gewoehnliche Datei.\n"); if (statbuf.st_mode & S_IREAD) printf("Der Benutzer hat Leseerlaubnis.\n"); if (statbuf.st_mode & S_IWRITE) printf("Der Benutzer hat Schreiberlaubnis.\n"); printf("Der Laufwerksbuchstabe ist %c\n",’A’+statbuf.st_dev); printf("Die Datei ist %ld Bytes gross\n", statbuf.st_size); printf("Datum der letzten Aenderung: %s", ctime(&statbuf.st_ctime)); return 0; } 260 KAPITEL 4. FUNKTIONEN 4.137 strcat() Name : strcat — hängt einen String an einen anderen. #include Benutzung : : <string.h> char *strcat(char *s1, const char *s2); Prototyp in : <string.h> (ANSI) Beschreibung : strcat() (string concatenate) hängt die Zeichen von String s2 an das Ende des Strings von s2. Das String-Endezeichen von String s1 wird überschrieben. Die Länge des Strings s1 muß mindestens strlen(s1) + strlen(s2) sein. Soll eine bestimmte Anzahl von Zeichen kopiert werden, ist die Funktion strncat() anzuwenden. Return-Wert: : Die Funktion gibt das erste Argument zurück. Querverweis : strncat Beispiel : s.u. UNIX : solaris 2.x : wie oben SunOS 4.1.x : char *strcat(char *s1, char *s2) Beispiel zur Funktion strcat() #include <string.h> #include <stdio.h> int main(void) { char destination[25]; char *blank = " ", *c = "C++ ist toll!", *turbo = "Turbo"; strcpy(destination, turbo); strcat(destination, blank); strcat(destination, c); printf("%s\n", destination); return 0; } 4.138. STRCHR() 4.138 strchr() Name : strchr — sucht ein Zeichen im String. #include Benutzung : : <string.h> char *strchr(const char *s, int c); Prototyp in : <string.h> 261 (ANSI) Beschreibung : strchr() (string character) sucht im String s das erste Auftreten des Zeichens c. Das String-Endezeichen \0 gilt als Zeichen des Strings. Das letzte Auftreten des Zeichens c in s kann mit der Funktion strrchr() festgestellt werden. Um ein Zeichen von mehreren Suchzeichen bzw. ein Teilstring zu suchen, kann die Funktion strpbrk() bzw. strstr() verwendet werden. Return-Wert: : Die Funktion liefert einen Zeiger auf die Stelle im String s, an der das Zeichen c zum ersten Mal auftritt. Kommt das Zeichen c im String nicht vor, wird ein NULL-Zeiger zurückgegeben. Querverweis : strcspn strrchr Beispiel : s.u. UNIX : Solaris 2.x : wie oben SunOS 4.1.x :char *strchr(char *s, int c); Beispiel zur Funktion strchr() #include <string.h> #include <stdio.h> int main(void) { char string[15]; char *ptr; int c = ’r’; strcpy(string, "Das ist ein String"); ptr = strchr(string, c); if (ptr) printf("Das Zeichen ’%c’ steht an Position %d\n", c, ptr-string+1); else printf("’%c’ nicht gefunden\n, c"); return 0; } 262 KAPITEL 4. FUNKTIONEN 4.139 strcmp() Name : strcmp — vergleicht zwei Strings miteinander. #include Benutzung : : <string.h> int strcmp(const char *s1, const char *s2); Prototyp in : <string.h> (ANSI) Beschreibung : strcmp() (string compare) vergleicht String s1 und s2 lexikographisch. Soll nur eine bestimmte Anzahl von Zeichen eines Strings verglichen werden, kann die Funktion strncmp() verwendet werden. Return-Wert: : Die Funktion liefert folgende Werte zurück: Return-Wert < 0 = 0 > 0 Bedeutung falls s1 < s2, falls s1 = s2, falls s1 > s2. Querverweis : strcmpi strcoll stricmp strncmp strncmpi strnicmp Beispiel : s.u. UNIX : Solaris 2.x : wie oben SunOS 4.1.x : int strcmp(char *s1, char *s2) 4.139. STRCMP() Beispiel zur Funktion strcmp() #include <string.h> #include <stdio.h> int main(void) { char *buf1 = "aaa", *buf2 = "bbb", *buf3 = "CCC"; int ptr; ptr = strcmp(buf2, buf1); if (ptr > 0) printf("%s ist groesser als %s\n", buf2, buf1); else printf("%s ist nicht groesser als %s\n", buf2, buf1); ptr = strcmp(buf2, buf3); if (ptr > 0) printf("%s ist groesser als %s\n", buf2, buf3); else printf("%s ist nicht groesser als %s\n", buf2, buf3); return 0; } 263 264 KAPITEL 4. FUNKTIONEN 4.140 strcpy() Name : strcpy — kopiert einen String in einen anderen. #include Benutzung : : <string.h> char *strcpy(char *s1, const char *s2); Prototyp in : <string.h> (ANSI) Beschreibung : strcpy() (string copy) kopiert den String s2 in den durch s1 adressierten Speicherbereich. s1 muß groß genug sein, um das String-Endezeichen mit aufnehmen zu können. Sollen maximal n Zeichen kopiert werden, ist die Funktion strncpy() zu verwenden. Return-Wert: : Die Funktion gibt s1 zurück. Querverweis : strncpy Beispiel : s.u. UNIX : Solaris 2.x : wie oben SunOS 4.2.1 : char *strcpy(char *s1, char *s2); Beispiel zur Funktion strcpy() #include <stdio.h> #include <string.h> int main(void) { char string[10]; char *str1 = "abcdefghi"; strcpy(string, str1); printf("%s\n", string); return 0; } 4.141. STRCSPN() 4.141 strcspn() Name : strcspn — liefert die Länge des Teilstrings von s1, der keines der Zeichen von String s2 enthält. (ANSI) #include Benutzung : : <string.h> size t *strcspn(const char *s1, const char *s2); Prototyp in : <string.h> Beschreibung : strcspn() (string counter set position) liefert die Länge des Teilstrings s von s1 zurück, der nur aus Zeichen besteht, die in s2 nicht vorkommen. Das ist die String-Länge von s1 , falls s1 kein Zeichen aus s2 enthält, oder der Index des ersten Zeichens in s1, das mit einem Zeichen aus s2 übereinstimmt. Einen Zeiger auf das entsprechende Zeiger liefert die Funktion strpbrk(). Die Länge des Teilstrings, der nur aus Zeichen des Strings s2 besteht, wird von strspn() ermittelt. Return-Wert: : Die Funktion liefert die Länge des Teilstrings von s1 zurück, der keines der Zeichen aus s2 enthält. Querverweis : strchr strrchr strpbrk strspn Beispiel : s.u. UNIX : Solaris 2.x : wie oben SunOs 4.1.x : int strcspn(char *s1, char *s2); Beispiel zur Funktion strcspn() #include <stdio.h> #include <string.h> #include <alloc.h> int main(void) { char *string1 = "1234567890"; char *string2 = "747DC8"; int length; length = strcspn(string1, string2); printf("Die ersten %d Zeichen von %s\n" "enthalten keines der Zeichen aus " "%s\n", length, string1, string2); return 0; 265 266 } KAPITEL 4. FUNKTIONEN 4.142. STRERROR() 4.142 strerror() Name : strerror — liefert einen Zeiger auf einen String mit Fehlermeldungen. (ANSI) #include Benutzung : : <string.h> char *strerror(int errnum); Prototyp in : <string.h> Beschreibung : strerror() (string error) gibt einen Zeiger auf die zur Zahl errnum gehörige Systemfehlermeldung zurück. Normalerweise ist die Zahl errnum der in der Fehlervariablen errno gespeicherte Wert. Im Unterschied zur Funktion perror() wird die Fehlermeldung nicht automatisch auf dem Bildschirm angezeigt. Hierfür muß z.B. die Funktion printf() extra aufgerufen werden. Return-Wert: : Die Funktion liefert eine Zeiger auf die Fehlermeldung zurück. Querverweis : perror Beispiel : s.u. UNIX : Solaris 2.x / SunOS 4.1.x : wie oben Beispiel zur Funktion strerror() #include <stdio.h> #include <errno.h> int main(void) { char *buffer; buffer = strerror(EFAULT); printf("Fehler: %s\n", buffer); return 0; } 267 268 KAPITEL 4. FUNKTIONEN 4.143 strlen() Name : strlen — ermittelt die Länge eines Strings. #include Benutzung : : <string.h> size t strlen(const char *s); Prototyp in : <string.h> (ANSI) Beschreibung : strlen() (string length) bestimmt die Länge des Strings s. Das StringEndezeichen wird nicht berücksichtigt. Der Datentyp size t ist in string.h als unsigned int definiert. Return-Wert: : Die Funktion liefert die Länge des Strings s zurück. Querverweis : Beispiel : s.u. UNIX : Solaris 2.x : wie oben SunOS 4.1.x : int strlen(char *s); Beispiel zur Funktion strlen() #include <stdio.h> #include <string.h> int main(void) { char *string = "C-Kursus"; printf("%d\n", strlen(string)); return 0; } 4.144. STRNCAT() 4.144 strncat() Name : strncat — hängt einen String bestimmter Länge an einen anderen. (ANSI) #include Benutzung : : <string.h> char *strncat(char *s1, const char *s2, size t n); Prototyp in : <string.h> Beschreibung : strncat() (string number concatenate) hängt die ersten n Zeichen des Strings s2 und \0 an den String s1. Enthält s2 weniger als n-Zeichen, so wird nur bis zum String-Ende von s2 kopiert. Soll der gesamte String s2 angehängt werden, ist die Funktion strcat() benutzt werden. Return-Wert: : Die Funktion liefert s1 zurück. Querverweis : Beispiel : s.u. UNIX : Solaris 2.x : wie oben SunOS 4.1.x : char *strncat(char *s1, char *s2, int n); Beispiel zur Funktion strncat() #include <string.h> #include <stdio.h> int main(void) { char destination[25]; char *blank = " ", *c = "C++ ist toll!", *turbo = "Turbo"; strcpy(destination, turbo); strcat(destination, blank); strcat(destination, c); printf("%s\n", destination); return 0; } 269 270 4.145 KAPITEL 4. FUNKTIONEN strncmp() Name : strncmp — vergleicht eine bestimmte Länge von zwei Strings miteinander. (ANSI) #include Benutzung : : <string.h> int strncmp(const char *s1, const char *s2, size t n); Prototyp in : <string.h> Beschreibung : strncmp() (string number compare) vergleicht die ersten n Zeichen von String s1 und s2. Return-Wert: : Die Funktion liefert die selben Return-Werte wie die Funktion strncmp() unter Berücksichtigung, daß nur n-Zeichen verglichen werden. Querverweis : Beispiel : s.u. UNIX : Solaris 2.x : wie oben SunOS 4.1.x : int strncmp(char *s1, char *s2, int n); 4.145. STRNCMP() Beispiel zur Funktion strncmp() #include <string.h> #include <stdio.h> int { main(void) char *buf1 = "aaabbb", *buf2 = "bbbccc", *buf3 = "ccc"; int ptr; ptr = strncmp(buf2,buf1,3); if (ptr > 0) printf("buf2 ist groesser als buf1\n"); else printf("buf2 ist kleiner als buf1\n"); ptr = strncmp(buf2,buf3,3); if (ptr > 0) printf("buf2 ist groesser als buf3\n"); else printf("buf2 ist kleiner als buf3\n"); return(0); } 271 272 KAPITEL 4. FUNKTIONEN 4.146 strncpy() Name : strncpy — kopiert einen String bestimmter Länge in einen anderen. (ANSI) #include Benutzung : : <string.h> char *strncpy(char *s1, const char *s2, size t n); Prototyp in : <string.h> Beschreibung : strncpy() (string number copy) kopiert die ersten n-Zeichen des Strings s2 in den durch s1 adressierten Speicherbereich. s1 muß mindestens die Länge n haben, wobei \0 nicht angehängt wird. Ist die String-Länge von s2 kleiner als n, wird der Rest mit \0 aufgefüllt. Soll der gesamte String s2 kopiert werden, ist die Funktion strcpy() zu verwenden. Return-Wert: : Die Funktion gibt s1 zurück. Querverweis : strcpy Beispiel : s.u. UNIX : Solaris 2.x : wie oben SunOS 4.1.x : char *strncpy(char *s1, char *s2, int n); Beispiel zur Funktion strncpy() #include <stdio.h> #include <string.h> int main(void) { char string[10]; char *str1 = "abcdefghi"; strncpy(string, str1, 3); /* an die vierte Position von string muss fuer printf ein NULL-Zeichen hinzugefuegt werden */ string[3] = ’\0’; printf("%s\n", string); return 0; } 4.147. STRPBRK() 4.147 strpbrk() Name : strpbrk — sucht in einem String nach dem Vorkommen bestimmter Zeichen ab. (ANSI) #include Benutzung : : <string.h> char *strpbrk(const char *s1, const char *s2); Prototyp in : <string.h> Beschreibung : strpbrk() (string pointer break) sucht den String s1 nach einem der in s2 enthaltenen Zeichen ab. Das \0-Zeichen wird nicht berücksichtigt. Ist nur ein Zeichen bzw. Teilstring zu suchen, so kann die die Funktion strchr() bzw. strstr() verwendet werden. Return-Wert: : Die Funktion gibt einen Zeiger auf das erste Zeichen in s1, das mit dem Zeichen in s2 übereinstimmt, zurück. Kommt in s1 kein Zeichen aus s2 vor, wird der NULL-Zeiger zurückgegeben. Querverweis : strchr strstr Beispiel : s.u. UNIX : Solaris 2.x : wie oben SunOS 4.1.x : char *strpbrk(char *s1, char *s2); Beispiel zur Funktion strpbrk() #include <stdio.h> #include <string.h> int main(void) { char string[10]; char *str1 = "abcdefghi"; strpbrk(string, str1, 3); /* an die vierte Position von string muss fuer printf ein NULL-Zeichen hinzugefuegt werden */ string[3] = ’\0’; printf("%s\n", string); return 0; } 273 274 KAPITEL 4. FUNKTIONEN 4.148 strrchr() Name : strrchr — sucht in einem String nach dem letzten Vorkommen eines Zeichens. (ANSI) #include Benutzung : : <string.h> char *strrchr(const char *s, int c); Prototyp in : <string.h> Beschreibung : strrchr() (string righ character) sucht im String s das letzte Auftreten des Zeichens c. Das String-Endezeichen \0 gilt als Zeichen des Strings. Das erste Auftreten des Zeichens c in s kann mit der Funktion strchr() festgestellt werden. Return-Wert: : Die Funktion liefert einen Zeiger auf die Stelle im String s, an der das Zeichen c zum letzten Mal auftritt. Kommt das Zeichen c im String nicht vor, wird ein NULL-Zeiger zurückgegeben. Querverweis : strcspn strchr Beispiel : s.u. UNIX : Solaris 2.x : wie oben SunOS 4.1.x : char *strrchr(char *s, int c); Beispiel zur Funktion strrchr() #include <string.h> #include <stdio.h> int main(void) { char string[15]; char *ptr; int c = ’i’; strcpy(string, "Das ist ein String"); ptr = strrchr(string, c); if (ptr) printf("strrchr hat ’%c’ an Position %d lokalisiert\n", c, ptr-string+1); else printf("’%c’ nicht gefunden\n"); return 0; } 4.149. STRSPN() 275 4.149 strspn() Name : strspn — liefert die Länge des Teilstrings s1, der nur Zeichen aus der Zeichenmenge s2 enthält. (ANSI) #include Benutzung : : <string.h> size t strspn(const char *s1, const char *s2); Prototyp in : <string.h> Beschreibung : strspn() (string set position) bestimmt die Länge des Teilstrings von s1, der nur Zeichen aus der Zeichenmenge von s2 enthält. Falls s1 nur Zeichen aus s2 enthält, wird die Stringlänge von s1 ermittelt, oder der Index des ersten Zeichens in s1, welches in s2 nicht vorkommt. Die Länge des Teilstrings, der kein Zeichen des Strings s2 enthält, wird mit der Funktion strcspn() ermittelt. Return-Wert: : Die Funktion gibt die Länge des Teilstrings von s1 zurück, der nur Zeichen aus s2 enthält. Querverweis : strcspn Beispiel : s.u. UNIX : Solaris 2.x : wie oben SunOS 4.1.x : int strcspn(char *s1, char *s2); Beispiel zur Funktion strspn() #include <stdio.h> #include <string.h> #include <alloc.h> int main(void) { char *string1 = "1234567890"; char *string2 = "2DC813"; int length; length = strspn(string1, string2); printf("Das erste Zeichen in %s, das in %s nicht vorkommt,\nsteht an " "Position %d.\n", string1, string2, length+1); return 0; } 276 KAPITEL 4. FUNKTIONEN 4.150 strstr() Name : strstr — sucht im String s1 nach einem Teilstring. #include Benutzung : : <string.h> char *strstr(const char *s1, const char *s2); Prototyp in : <string.h> (ANSI) Beschreibung : strstr() (string in string) sucht im String s1 den Teilstring s2 (ohne String-Endezeichen \0). Um ein Zeichen oder eines von mehreren Suchzeichen zu lokalisieren, kann die Funktion strchr() oder strpbrk() verwendet werden. Return-Wert: : Die Funktion liefert einen Zeiger auf den Beginn von s2 in s1 zurück. Ist s2 in s1 nicht enthalten, wird ein NULL - Zeiger zurückgegeben. Hat s2 die Länge 0, ist der Return-Wert s1. Querverweis : strchr strpbrk Beispiel : s.u. UNIX : Solaris 2.x : wie oben SunOS 4.1.x : char *strstr(char *s1, char *s2); Beispiel zur Funktion strstr() #include <stdio.h> #include <string.h> int main(void) { char *str1 = "International", *str2 = "nation", *ptr; ptr = strstr(str1, str2); printf("Das ist der Substring: %s\n", ptr); return 0; } 4.151. STRTOD() 4.151 strtod() Name : strtod — konvertiert einen String in einen double-Wert. #include Benutzung : : <stdlib.h> double strtod(const char *s, char **endptr); Prototyp in : <stdlib.h> 277 (ANSI) Beschreibung : strtod() (string to double) wandelt einen String s in eine Zahl vom Typ double um. Bei dem ersten Zeichen, welches nicht als Teil einer Gleitkommazahl interpretiert werden kann, wird die Umwandlung unterbrochen. Als zweites Argument erwartet die Funktion die Adresse eines charZeigers. Falls dies nicht der NULL- Zeiger ist, wird der durch endptr adressierte char-Zeiger auf das erste Zeichen von s gesetzt, das nicht mehr als Teil der Gleitpunktzahl interpretiert werden konnte. Die umzuwandelnde Zahl muß in der üblichen Gleitkommadarstellung vorliegen. Führende Zwischenraumzeichen werden ignoriert. Return-Wert: : Die Funktion liefert einen double-Wert zurück. Im Falle eines Überlaufs wird plus oder minus HUGE VAL zurückgeliefert, bei einem Unterlauf 0. In beiden Fällen erhält die Fehlervariable errno den Wert ERANGE (= range error). Querverweis : atof Beispiel : s.u. UNIX : Solaris 2.x : wie oben sunOS 4.1.x : double strtod(char *str, char **endptr); 278 KAPITEL 4. FUNKTIONEN Beispiel zur Funktion strtod() #include <stdio.h> #include <stdlib.h> int main(void) { char input[80], *endptr; double value; printf("Geben Sie eine Fliesspunktzahl " "ein: "); gets(input); value = strtod(input, &endptr); printf("Der String %s\nwurde in die Zahl " "%lf konvertiert.\n", input, value); return 0; } 4.152. STRTOK() 279 4.152 strtok() Name : strtok — sucht einen String nach einer von mehreren Zeichenfolgen ab, die in einem zweiten String definiert sind. (ANSI) #include Benutzung : : <string.h> char *strtok(const char *s1, const char *s2); Prototyp in : <string.h> Beschreibung : strtok() (string token) zerlegt den String s1 in sogenannte Token, die voneinander in der s2 definierten Zeichenkette getrennt sind. Enthält s1 den String Hallo C-Freaks ! und s2 die Zeichenkette (blank), dann sind in s1 drei Token enhalten. Dieses sind: Hallo,C-Freaks und !. Beim ersten Aufruf bestimmt die Funktion das erste Token in s1 und hängt ein String-Endezeichen \0 an. Der ursprüngliche String s1 wird also verändert, indem das erste Trennzeichen nach dem Token durch das String-Endezeichen \0 überschrieben wird. Bei jedem weiteren Aufruf der Funktion mit NULL anstelle von s1 wird das nächste Token gesucht und ein String-Endekennzeichen \0 angehängt. Der String s2 kann bei jedem Aufruf der Funktion ausgewechselt werden. Bei dem ersten Zeichen, welches nicht als Teil einer Gleitkommazahl interpretiert werden kann, wird die Umwandlung unterbrochen. Als zweites Argument erwartet die Funktion die Adresse eines charZeigers. Falls dies nicht der NULL- Zeiger ist, wird der durch endptr adressierte char-Zeiger auf das erste Zeichen von s gesetzt, das nicht mehr als Teil der Gleitpunktzahl interpretiert werden konnte. Die umzuwandelnde Zahl muß in der üblichen Gleitkommadarstellung vorliegen. Führende Zwischenraumzeichen werden ignoriert. Return-Wert: : Die Funktion liefert einen double-Wert zurück. Im Falle eines Überlaufs wird plus oder minus HUGE VAL zurückgeliefert, bei einem Unterlauf 0. In beiden Fällen erhält die Fehlervariable errno den Wert ERANGE (= range error). Querverweis : atof Beispiel : s.u. UNIX : Solaris 2.x : wie oben SubOS 4.1.x : char *strtok(char *s1, char *s2); 280 KAPITEL 4. FUNKTIONEN Beispiel zur Funktion strtok() #include <string.h> #include <stdio.h> int main(void) { char input[80] = "ein, zwei Woerter; ..." "(usw.)\nSchluss\tjetzt"; char *p; printf("Das war der String: %s\n", input); /* erstes "token" */ p = strtok(input, " ,"); while (p) { printf("%s\n", p); /* folgende "tokens" */ p = strtok(NULL, " ,.;()\t\n"); } return 0; } 4.153. STRTOL() 4.153 281 strtol() Name : strtol — konvertiert einen String in einen long-Wert. #include Benutzung : : <stdlib.h> long strtol(const char *s, char **endptr, int base); Prototyp in : <stdlib.h> Beschreibung : (ANSI) strtol() (string to long) wandelt einen String s in eine Zahl vom Typ long um. Die Zeichenfolge wird gemäß der Basis base umgewandelt, wobei base im Bereich 2 . . . 36 liegen kann. Bei base = 0 gilt folgende Konvention: erstes Zeichen 0 0 1 bis 9 zweites Zeichen 1 bis 7 x oder X String wird interpretiert als Oktalzahl Hexadezimalzahl Dezimalzahl Die Umwandlung wird abgebrochen, wenn das Zeichen nicht als Teil einer Zahl zur Basis base interpretiert werden kann. Dabei werden führende Zwischenraumzeichen überlesen. Wurde für den Paramter endptr die Adresse eines Zeigers angegeben, wird der durch endptr adressierte char-Zeiger auf das erste Zeichen im String s gesetzt, welches nicht mehr als Teil einer Zahl zur Basis base interpretiert werden konnte. Return-Wert: : Die Funktion liefert einen long-Wert zurück. Konnte keine Umwandlung durchgeführt werden, wird der Wert 0 zurückgegeben. Im Falle eines Überlaufs ist der Return-Wert LONG MAX bzw. LONG MIN je nach Vorzeichen und die Fehlervariable errno erhält den Wert ERANGE (= range error). Querverweis : atoi atol stroul Beispiel : s.u. UNIX : Solaris 2.x : wie oben SunOS 4.1.x : long strtol(char *s, char **endptr, int base); 282 KAPITEL 4. FUNKTIONEN Beispiel zur Funktion strtol() #include <stdlib.h> #include <stdio.h> int main(void) { char *string = "-0xCafe15", *endptr; long lnumber; /* konvertiert den String in einen long-Wert lnumber = strtol(string, &endptr, 0); printf("String = %s\nlong = %ld\n", string, lnumber); return 0; } */ 4.154. STRTOUL() 4.154 strtoul() Name : 283 strtoul — konvertiert einen String in einen unsigned long-Wert. (ANSI) #include Benutzung : : <stdlib.h> double strtoul(const char *s, char **endptr, int base); Prototyp in : <stdlib.h> Beschreibung : strtoul() (string to unsigned long) wandelt einen String s in eine Zahl vom Typ unsigned long um. Die Zeichenfolge wird gemäß der Basis base umgewandelt, wobei base im Bereich 2 . . . 36 liegen kann. Bei base = 0 gilt folgende Konvention: erstes Zeichen 0 0 1 bis 9 zweites Zeichen 1 bis 7 x oder X String wird interpretiert als Oktalzahl Hexadezimalzahl Dezimalzahl Die Umwandlung wird abgebrochen, wenn das Zeichen nicht als Teil einer Zahl zur Basis base interpretiert werden kann. Dabei werden führende Zwischenraumzeichen überlesen. Wurde für den Parameter endptr die Adresse eines Zeigers angegeben, wird der durch endptr adressierte char-Zeiger auf das erste Zeichen im String s gesetzt, welches nicht mehr als Teil einer Zahl zur Basis base interpretiert werden konnte. Return-Wert: : Die Funktion liefert einen long-Wert zurück. Konnte keine Umwandlung durchgeführt werden, wird der Wert 0 zurückgegeben. Im Falle eines Überlaufs ist der Return-Wert LONG MAX bzw. LONG MIN je nach Vorzeichen und die Fehlervariable errno erhält den Wert ERANGE (= range error). Querverweis : atoi atol stroul Beispiel : s.u. UNIX : Solaris 2.x : wie oben SunOS 4.1.x : nicht vorhanden 284 KAPITEL 4. FUNKTIONEN Beispiel zur Funktion strtoul() #include <stdlib.h> #include <stdio.h> int main(void) { char *string = "0xCafe15", *endptr; unsigned long lnumber; /* konvertiert den String in einen long-Wert */ lnumber = strtoul(string, &endptr, 0); printf("String = %s\nu-long = %ld\n", string, lnumber); return 0; } 4.155. SYSTEM() 285 4.155 system() Name : system — Ausführung eines DOS-Befehls. #include Benutzung : : <stdlib.h> int system(const char *s); Prototyp in : <string.h> (ANSI) Beschreibung : system() (system) übergibt den in s angegebenen String an dem Kommando-Interpreter des Betriebssystems. Der abgesetzte Befehl wird so ausgeführt, als wäre dieser auf Betriebsystemebene über die Tastatur abgesetzt worden. Mit der Übergabe des NULL-Zeiger kann festgestellt werden, ob ein Kommando-Interpreter verfügbar ist. Return-Wert: : Die Funktion liefert einen Wert ungleich Null, falls s ein NULL-Zeiger und der Kommando-Interpreter verfügbar ist. Ist s kein NULL-Zeiger, so wird der Wert 0, falls der Kommando-Interpreter erfolgreich gestartet wurde. Ist das Argument nicht der NULL-Zeiger, so ist der Return-Wert vom Compiler abhängig. In der Regel wird bei korrekter Ausführung des Befehls der Wert 0 zurückgegeben. Ein von 0 verschiedener Wert zeigt einen Fehler an. Querverweis : exec . . . searchpath spawn . . . Beispiel : s.u. UNIX : Solaris 2.x : wie oben, Headerdatei ist <stdlib.h> SunOS 4.1.x : system(char *string); steht in keinem Headerfile Beispiel zur Funktion system() #include <stdlib.h> #include <stdio.h> int main(void) { printf("Uebergibt an COMMAND.COM und kann " "auch einen internen DOS-Befehl ausfuehren:\n"); system("dir *.c /p"); return 0; } 286 4.156 KAPITEL 4. FUNKTIONEN tan() Name : tan — berechnet den Tangens des Argumentes x. #include Benutzung : : <math.h> double tan(double x); complex tan(complex x); Prototyp in : <math.h> (reel) <complex.h> (complex) (ANSI) Beschreibung : tan() (tangent) berechnet den Tangens des Argumentes x. Der Wert von x wird als Bogenmaß interpretiert. Ist der Absolutwert des Argumentes sehr groß, so kann daraus eine zu große Ungenauigkeit für das Ergebnis entstehen. Return-Wert: : Die Funktion gibt den Tangens von x im Bogenmaß zurück. Ist der Argumentwert zu groß für ein signifikantes Ergebnis oder liegt x zu nahe an an dem ganzzahligen Vielfachen von PI/2, den Polstellen der Tangensfunktion, so wird der Wert 0 zurückgegeben. In beiden Fällen erhält die Fehler- variable errno den Wert ERANGE (= range error). Fehlerbehandlung kann ev. unter Verwendung der Funktion matherr geändert werden. Querverweis : acos asin atan atan2 cos sin Beispiel : printf(“tan(-1.0) = %7.4f\n“,tan(-1.0)); printf(“tan(0.0) = %7.4f\n“,tan(0.0)); printf(“tan(1.0) = %7.4f\n“,tan(1.0)); Ergebnis : tan(-1.0) = -1.5574 tan(0.0) = 0.0000 tan(1.0) = 1.5574 UNIX : Solaris 2.x / SunOS 4.1.x : wie oben, nur für reele Zahlen 4.156. TAN() Beispiel zur Funktion tan() #include <stdio.h> #include <math.h> int main(void) { double result, x; x = 0.5; result = tan(x); printf("Der Tangens von %lf ist %lf\n", x, result); return 0; } 287 288 4.157 KAPITEL 4. FUNKTIONEN tanh() Name : tanh — berechnet den Tangens Hyperbolicus des Argumentes x. (ANSI) #include Benutzung : : <math.h> double tanh(double x); complex tanh(complex x); Prototyp in : <math.h> (reel) <complex.h> (complex) Beschreibung : tanh() (hyperbolic tangent) berechnet den Tangens hyperbolicus des Argumentes x. Return-Wert: : Die Funktion liefert den Tangens hyperbolicus von x zurück, der zwischen -1 und +1 liegt. Ein Fehlerwert wird nicht angezeigt. Querverweis : cos cosh sin sinh tan Beispiel : printf(“tanh(-2.0) = %7.4f\n“,tanh(-2.0)); printf(“tanh(0.0) = %7.4f\n“,tanh(0.0)); printf(“tanh(2.0) = %7.4f\n“,tanh(2.0)); Ergebnis : tanh(-2.0) = -.9640 tanh(0.0) = 0.0000 tanh(2.0) = 0.9640 UNIX : Solaris 2.x / SunOS 4.1.x : wie oben, nur für reele Zahlen Beispiel zur Funktion tanh() #include <stdio.h> #include <math.h> int main(void) { double result, x; x = 0.5; result = tanh(x); printf("Der Tangens hyperbolicus von %lf ist %lf\n", x, result); return 0; } 4.158. TIME() 4.158 289 time() Name : time — liefert Datum und Uhrzeit des Systems. #include Benutzung : : <time.h> time t time(time t, *ptr); Prototyp in : <time.h> (ANSI) Beschreibung : time() (time) berechnet die Anzahl der Sekunden, die seit dem 1.1.1970, 00:00:00 Uhr (Greenwich Mean Time) vergangen sind. Das Ergebnis wird sowohl in dem durch ptr adressierten Speicherplatz gespeichert als auch als Return-Wert zurückgegeben. Das Argument ptr kann anschließend einer der Funktionen ctime(), gmtime() oder localtime zur entsprechenden Formatumwandlung übergeben werden. Wird der NULL-Zeiger als Argument übergeben, wird das Ergebnis nur als Return-Wert zurückgegeben. Der Datentyp time t ist in time.h als long definiert. Return-Wert: : Die Funktion liefert die Anzahl der Sekunden, die seit dem 1.1.19070, 00:00:00 Uhr vergangen sind, zurück. Querverweis : asctime localtime timezone ctime gmtime gettime Beispiel UNIX : : s.u. Solaris 2.x / SunOS 4.1.x : wie oben Beispiel zur Funktion time() #include <time.h> #include <stdio.h> #include <dos.h> int main(void) { time_t t; t = time(NULL); printf("%ld Sekunden sind seit dem 1.Januar 1970 vergangen.\n",t); return 0; } 290 KAPITEL 4. FUNKTIONEN 4.159 tmpfile() Name : tmpfile — eröffnet eine temporäre Datei im Binär-Modus. #include Benutzung : : <stdio.h> FILE *tmpfile(void); Prototyp in : <stdio.h> (ANSI) Beschreibung : tmpfile() (temporary file) eröffnet eine temporäre Datei im BinärModus zum Schreiben und Lesen (w+b). Die Datei wird automatisch gelöscht, wenn das Programm endet oder wenn die Datei vorher geschlossen wird. Return-Wert: : Die Funktion liefert einen File-Pointer zurück, wenn die Datei eröffnet werden konnte, anderfalls einen NULL-Zeiger. Querverweis : fopen tmpnam Beispiel : s.u. UNIX : Solaris 2.x / SunOS 4.1.x : wie oben Beispiel zur Funktion tmpfile() #include <stdio.h> #include <process.h> int main(void) { FILE *tempfp; tempfp = tmpfile(); if (tempfp) printf("Temporaere Datei angelegt.\n"); else { printf("Konnte temporaere Datei nicht anlegen.\n"); exit(1); } return 0; } 4.160. TMPNAM() 4.160 tmpnam() Name : tmpnam — erzeugt eindeutige Namen für temporäre Dateien. (ANSI) #include Benutzung : : <stdio.h> char *tmpnam(char *s); Prototyp in : <stdio.h> Beschreibung : tmpnam() (temporary name) erzeugt einen neuen Dateinamen, der für eine temporäre Datei verwendet werden kann. Es wird garantiert, daß der neu Dateiname von allen bereits existierenden im aktuellen Directory verschieden ist, Falls s ein NULL-Zeiger enthält, wird der erzeugte Dateiname in einem internen statischen Puffer abgelegt, der bei einem erneuten Aufruf der Funktion tmpnam() überschrieben wird. Ist s kein NULL-Zeiger, so erwartet tmpnam(), daß s auf einen charVektor zeigt, der mindestens L tmpnam-Bytes speichern kann. In s wird der Dateiname kopiert. Die Funktion kann bis zu TMP MAX verschiedene Dateinamen erstellen. Die symbolischen Konstanten L tmpnam und TMP MAX sind in stdio.h definiert. Return-Wert: : Die Funktion liefert in s einen Dateinamen zurück, wenn s nicht der NULL-Zeiger ist. Ist s ein NULL-Zeiger, so wird ein Zeiger auf den internen Puffer mit dem neuen Dateinamen geliefert. Querverweis : tmpfile Beispiel : s.u. UNIX : Solaris 2.x / SunOS 4.1.x : wie oben 291 292 KAPITEL 4. FUNKTIONEN Beispiel zur Funktion tmpnam() #include <stdio.h> #include <process.h> int main(void) { FILE *tempfp; tempfp = tmpnam(); if (tempfp) printf("Temporaere Datei angelegt.\n"); else { printf("Konnte temporaere Datei nicht anlegen.\n"); exit(1); } return 0; } 4.161. TOASCII() 4.161 toascii() Name : toascii — Konvertierung von Zeichen in das ASCII-Format. Benutzung : int toascii(int c); Prototyp in : <ctype.h> Beschreibung : toascii() (to ASCII) konvertiert das in c gespeicherte Zeichen in ein Standard-ASCII-Zeichen. Dabei werden alle Bits, bis auf die sieben niederwertigen Bits, auf 0 gesetzt. Ist das Zeichen in c bereits ein ASCII- Zeichen, so erfolgt keine Konvertierung. Um das Zeichen zu überprüfen, ob es es ein Standard- ASCII-Zeichen ist, kann das Makro isascii() verwendet werden. Return-Wert: : Das Makro liefert einen int- Wert als Ergebnis der Konvertierung zurück. Querverweis : Beispiel : s.u. UNIX : Solaris 2.x / SunOS 4.1.x : wie oben Beispiel zur Funktion toascii() #include <stdio.h> #include <ctype.h> int main(void) { int nummer, ergeb; nummer = 225; ergeb = toascii(nummer); printf("%d %d\n", nummer, ergeb); } 293 294 KAPITEL 4. FUNKTIONEN 4.162 tolower() Name : tolower — wandelt Groß- in Kleinbuchstaben um. #include Benutzung : : <ctype.h> int tolower(int c); Prototyp in : <ctype.h> (ANSI) Beschreibung : tolower() (to lower) wandelt ein Großbuchstaben A . . . Z in ein Kleinbuchstaben um. Return-Wert: : Die Funktion liefert einen int-Wert zurück, falls c ein Großbuchstabe ist; ansonsten ist das Ergebnis undefiniert. Querverweis : Beispiel : s.u. UNIX : Solaris 2.x / SunOS 4.1.x : wie oben Beispiel zur Funktion tolower() #include <string.h> #include <stdio.h> #include <ctype.h> int main(void) { int length, i; char *string = "DAS IST EIN STRING"; length = strlen(string); for (i = 0; i < length; i++) { string[i] = tolower(string[i]); } printf("%s\n",string); return 0; } 4.163. TOUPPER() 4.163 295 toupper() Name : toupper — wandelt Klein- in Großbuchstaben um. #include Benutzung : : <ctype.h> int toupper(int c); Prototyp in : <ctype.h> (ANSI) Beschreibung : toupper() (to upper) wandelt einen Kleinbuchstaben in einen Großbuchstaben um. Für die korrekte Konvertierung muß das Zeichen c einen Wert im Bereich von 0 . . . 255 oder den Wert EOF haben. Return-Wert: : Die Funktion liefert einen int-Wert zurück, falls c ein Kleinbuchstabe ist; ansonsten wird das Zeichen unverändert zurückgegeben. Querverweis : Beispiel : s.u. UNIX : Solaris 2.x / SunOS 4.1.x : wie oben Beispiel zur Funktion toupper() #include <string.h> #include <stdio.h> #include <ctype.h> int main(void) { int length, i; char *string = "das ist ein string"; length = strlen(string); for (i = 0; i < length; i++) { string[i] = toupper(string[i]); } printf("%s\n",string); return 0; } 296 KAPITEL 4. FUNKTIONEN 4.164 ungetc() Name : ungetc — schreibt ein gelesenes Zeichen in eine Datei zurück. (ANSI) #include Benutzung : : <stdio.h> int ungetc(int c, FILE *fp); Prototyp in : <stdio.h> Beschreibung : ungetc() (unget character) schreibt das gelesene Zeichen wieder in den mit dem File-Pointer fp verbundenen Dateipuffer zurück. Eine darauf folgende Leseoperation enthält das Zeichen c. In der Regel kann ungetc() nur einmal aufgerufen werden, danach muß ein Zeichen gelesen werden. Ein evtl. gesetztes EOF-Flag wird gelöscht. Nach dem Lesen des zurückgestellten Zeichens ist die aktuelle Dateiposition dieselbe wie vor dem Zurückstellen des Zeichens. Das zurückgestellte Zeichen geht verloren, wenn die Dateiposition durch fseek(), rewind(), oder fsetpos() verändert wird. Return-Wert: : Die Funktion liefert das Zeichen c zurück. Im Fehlerfall wird EOF zurückgeben. Querverweis : fgetc getc getchar Beispiel : s.u. UNIX : Solaris 2.x / SunOS 4.1.x : wie oben 4.164. UNGETC() Beispiel zur Funktion ungetc() #include <stdio.h> #include <ctype.h> int main( void ) { int i=0; char ch; puts("Geben Sie eine ganze Zahl, gefolgt " "von einem Buchstaben ein: "); /* liest Zeichen bis zur ersten Nichtziffer oder bis EOF */ while((ch = getchar()) != EOF && isdigit(ch)) /* konvertiert ASCII in einen int-Wert */ i = 10 * i + ch - 48; /* legt das Zeichen zurueck auf den EingabeStream, falls es nicht EOF war */ if (ch != EOF) ungetc(ch, stdin); printf("der int-Wert ist ’%d’, und ’%c’ ist" " das naechste Zeichen im Puffer.\n", i, getchar()); return 0; } 297 298 4.165 KAPITEL 4. FUNKTIONEN ungetch() Name : ungetch — stellt ein gelesenes Zeichen von der Tastatur in den Tasturpuffer zurück. #include Benutzung : : <conio.h> int ungetch(int c, FILE *fp); Prototyp in : <conio.h> Beschreibung : ungetch() (unget character) schreibt das gelesene Zeichen wieder in den Tastaturpuffer zurück. Es kann nur ein Zeichen zurückgestellt werden. Eine darauf folgende Leseoperation erfolgt mit getch() oder getche(). Return-Wert: : Die Funktion liefert das Zeichen c zurück. Im Fehlerfall wird EOF zurückgeben. Querverweis : getch getche Beispiel : s.u. UNIX : Solaris 2.x : mit anderer Bedeutung SunOS 4.1.x : nicht vorhanden 4.165. UNGETCH() Beispiel zur Funktion ungetch() #include <stdio.h> #include <ctype.h> #include <conio.h> int main( void ) { int i=0; char ch; puts("Geben Sie eine ganze Zahl, gefolgt " "von einem Buchstaben ein: "); /* liest Zeichen bis zur ersten Nichtziffer oder bis EOF */ while((ch = getch()) != EOF && isdigit(ch)) { /* gibt das Zeichen am Bildschirm aus */ putch(ch); /* konvertiert ASCII in einen int-Wert */ i = 10 * i + ch - 48; } /* legt das Zeichen zurueck auf den EingabeStream, falls es nicht EOF war */ if (ch != EOF) ungetch(ch); printf("\nder int-Wert ist ’%d’ und ’%c’" "ist das naechste Zeichen im Stream.\n", i, getch()); return 0; } 299 300 KAPITEL 4. FUNKTIONEN 4.166 unlink() Name : unlink — löscht eine Datei. #include Benutzung : : <io.h> int unlink(const char *filename); Prototyp in : <dos.h io.h stdio.h> Beschreibung : unlink() (unlink) löscht die durch filename spezifizierte Datei, wobei filenaname einen vollständigen Laufwerksbezeichner enthalten kann. Jokerzeichen ∗ und ? sind nicht zulässig. Schreibgeschützte Dateien oder Directories können mit unlink() nicht gelöscht werden. Return-Wert: : Die Funktion liefert bei korrekter Durchführung den Wert 0 zurück. Im Fehlerfall wird der Wert -1 zurückgegeben, und die Fehlervariable errno erhält den Wert EACCES = permission denied bzw. ENOENT = no such file or directory. Querverweis : chmod remove Beispiel : s.u. UNIX : Solaris 2.x : wie oben, Headerdatei ist <unistd.h> SunOS 4.1.x : int unlink(char *filename) Headerdatei ist <unistd.h> 4.166. UNLINK() Beispiel zur Funktion unlink() #include <stdio.h> #include <io.h> int main(void) { FILE *fp = fopen("junk.jnk","w"); int status; fprintf(fp,"junk"); status = access("junk.jnk",0); if (status == 0) printf("Die Datei existiert.\n"); else printf("Die Datei existiert nicht.\n"); fclose(fp); unlink("junk.jnk"); status = access("junk.jnk",0); if (status == 0) printf("Die Datei existiert.\n"); else printf("Die Datei existiert nicht.\n"); return 0; } 301 302 KAPITEL 4. FUNKTIONEN 4.167 va arg() Name : va arg, va end, va start — Makros für Funktionen variabler Parameterzahl. (ANSI) #include Benutzung : : <stdarg.h> void va start(va list argptr, lastfix); type va arg(va list argptr, type); void va end(va list argptr); Prototyp in : <stdarg.h> Beschreibung : Hinweis : Die Makros va start() und va arg() ermöglichen die Deklaration und Aufrufe von Funktionen mit variabler Parameterzahl zu definieren. Die Funktion muß mindestens ein festes Argument besitzen. Das Makro va start() (variable start) initialisiert den Zeiger argptr durch Setzen des Zeigers auf das erste optionale Argument. Dazu muß für lastfix der Name des Parameters für das letzte Argument der Funktion angegeben werden. Das Makro va arg() (variable argument) übergibt das nächste Argument der Funktion, auf das argptr zeigt. Dazu ist der Datentyp type des Argumentes anzugeben. Anschließend wird argptr auf das nachfolgende variable Argument der Funktion gesetzt. Vor Nutzung von va arg() muß das Makro va start() aufgerufen worden sein. Das Makro va end() (variable end) sollte aufgerufen werden, wenn alle Argumente gelesen wurden. In der Regel wird dadurch argptr auf NULL gesetzt. Mit va arg() können keine Werte vom Typ char, unsigned char oder float verwendet werden. Return-Wert: : Das Makro va arg() gibt das jeweils nächste Argument zurück. Die Makros va start() und va end() besitzen keinen Return-Wert. Querverweis : vprintf vscanf Beispiel : s.u. UNIX : Solaris 2.x / SunOS 4.1.x : nicht vorhanden 4.167. VA ARG() Beispiel zur Funktion va arg() #include <stdio.h> #include <stdarg.h> /* Summe ermitteln */ void sum(char *msg,...) { int total = 0; va_list ap; int arg; va_start(ap,msg); while ((arg = va_arg(ap,int)) != 0) { total += arg; } printf(msg,total); } int main(void) { sum("Die Summe von 1+2+3+4 ist %d\n",1,2,3,4,0); return 0; } 303 304 4.168 KAPITEL 4. FUNKTIONEN vfprintf(), vprintf(), vsprintf() Name : vfprintf, vprintf, vsprintf — formatierte Ausgabe mit Zeiger auf Argumentliste. (ANSI) #include Benutzung : : <stdio.h> int vfprintf(FILE *fp, const char *formatstring, va list argptr); int vprintf(const char *formatstring, va list argptr); int vsprintf(char *buf, const char *formatstring, va list argptr); Prototyp in : <stdio.h> Beschreibung : Die Funktionen vfprintf(), vprintf() und vsprintf() (variable . . . ) entsprechen den Funktionen fprintf(), printf() und sprintf(). Die v . . . Funktionen benötigen einen Zeiger auf die Argumentliste. Return-Wert: : Anzahl der ausgegebenen Zeichen. Querverweis : vprintf vscanf printf va arg va start va end Beispiel : s.u. UNIX : Solaris 2.x / SunOS 4.1.x : wie oben 4.168. VFPRINTF(), VPRINTF(), VSPRINTF() Beispiel zur Funktion vfprintf() #include <stdio.h> #include <stdlib.h> FILE *fp; int vfpf(char *fmt, ...) { va_list argptr; int cnt; va_start(argptr, fmt); cnt = vfprintf(fp, fmt, argptr); va_end(argptr); return(cnt); } int main( void ) { int inumber = 30; float fnumber = 90.0; char string[4] = "abc"; fp = tmpfile(); if (fp == NULL) { perror("Fehler beim Aufruf von " "tmpfile()"); exit(1); } vfpf("%d %f %s", inumber, fnumber, string); rewind(fp); fscanf(fp,"%d %f %s", &inumber, &fnumber, string); printf("%d %f %s\n", inumber, fnumber, string); fclose(fp); return 0; } 305 306 KAPITEL 4. FUNKTIONEN Beispiel zur Funktion vprintf() #include <stdio.h> int vpf(char *fmt, ...) { va_list argptr; int cnt; va_start(argptr, fmt); cnt = vprintf(fmt, argptr); va_end(argptr); return(cnt); } int main(void) { int inumber = 30; float fnumber = 90.0; char *string = "abc"; vpf("%d %f %s\n", inumber, fnumber, string); return 0; } 4.168. VFPRINTF(), VPRINTF(), VSPRINTF() Beispiel zur Funktion vsprintf() #include <stdio.h> #include <conio.h> char buffer[80]; int vspf(char *fmt, ...) { va_list argptr; int cnt; va_start(argptr, fmt); cnt = vsprintf(buffer, fmt, argptr); va_end(argptr); return(cnt); } int main(void) { int inumber = 30; float fnumber = 90.0; char string[3] = "abc"; vspf("%d %f %s", inumber, fnumber, string); printf("%s\n", buffer); return 0; } 307 308 KAPITEL 4. FUNKTIONEN Beispiel zur Funktion vfscanf() #include <stdio.h> #include <stdlib.h> FILE *fp; int vfsf(char *fmt, ...) { va_list argptr; int cnt; va_start(argptr, fmt); cnt = vfscanf(fp, fmt, argptr); va_end(argptr); return(cnt); } int main(void) { int inumber = 30; float fnumber = 90.0; char string[4] = "abc"; fp = tmpfile(); if (fp == NULL) { perror("Fehler bei tmpfile()"); exit(1); } fprintf(fp,"%d %f %s\n", inumber, fnumber, string); rewind(fp); vfsf("%d %f %s", &inumber, &fnumber, string); printf("%d %f %s\n", inumber, fnumber, string); fclose(fp); return 0; } 4.169. WRITE() 4.169 309 write() Name : write — schreibt Daten in eine Datei. #include Benutzung : : <io.h> int write(int fd, void *buffer, unsigned n); Prototyp in : <io.h> Beschreibung : write() (write) schreibt n Bytes aus den durch buffer angegebenen Speicherbereich in die mit dem File-Handle fd verbundenen Datei. Wird die Datei im Modus text (DOS) eröffnet, dann wird der Zeilenvorschub \n in die Zeichenfolge CR \LF (0x0D, 0x0A) übersetzt. Bei Diskettendateien schreibt write() ab der aktuellen Position. Bei Gerätedateien ist eine Position nicht definiert – es wird direkt zum Gerät geschrieben. Mit write sollten max. 65534 Bytes geschrieben werden (am Stück). Wurde die Datei im Modus Append – O APPEND geöffnet, wird ab Dateiende geschrieben. Return-Wert: : Die Funktion liefert die tatsächlich geschriebenen Bytes als positive Integer zurück, wobei CR \LF als ein Byte gezählt werden. Im Fehlerfall ist der Return-Wert -1 und die Fehlervariable errno erhält folgende Werte: errno Bedeutung EACCES Zugriff nicht gestattet EBADF ungültiger File-Handle, Datei nicht offen Querverweis : fgetpos fseek fsetpos lseek rewind tell Beispiel : s.u. UNIX : Solaris 2.x : ssize t write(inf fd, const void *buffer, size t n); Headerdatei ist <unistd.h> SunOS 4.1.x : int write(int fd char *buffer, int n); für System V wie oben Headerdatei ist <unistd.h> 310 KAPITEL 4. FUNKTIONEN Beispiel zur Funktion write() #include <stdio.h> #include <stdlib.h> #include <fcntl.h> #include <sys\stat.h> #include <io.h> #include <string.h> int main(void) { int handle; char string[40]; int length, res; /* Erzeugt die Datei "TEST.$$$" im aktuellen Directory und schreibt einen String in die Datei. Falls "TEST.$$$" bereits existiert, wird sie ueberschrieben. */ if ((handle = open("TEST.$$$", O_WRONLY | O_CREAT | O_TRUNC, S_IREAD | S_IWRITE)) == -1) { printf("Fehler beim Oeffnen der Datei.\n"); exit(1); } strcpy(string, "Hallo, Freunde!\n"); length = strlen(string); if ((res = write(handle, string, length)) != length) { printf("Fehler beim Schreiben der " "Datei.\n"); exit(1); } printf("%d Bytes in die Datei " "geschrieben.\n", res); close(handle); return 0; } Literaturverzeichnis [1] BORLAND C++ 3.1 Programmierhandbuch, 1992. [2] BORLAND C++ 3.1 Referenzhandbuch, 1992. [3] Stefan und Georg Rudolph Der C-Crash-Kurs McGraw-Hill, 1990, ca. 45.- DM Es ist nicht speziell auf dem Borland-Compiler zugeschnitten. [4] Burkhard Sachs Borland C++ und Turbo C++ Hanser, 1992, ca. 38.- DM Es ist für den Anfänger empfehlenswert und berücksichtigt das “Handling“ der Programmierumgebung. Deckt aber den Umfang des Kurses nicht ab. [5] Gerd Kebschull Turbo C++ Vogel-Verlag, 1990, ca. 58.- DM Ist besonders als Handbuchergänzung geeignet, enthält viele Beispiele und die Darstellung der Bibliotheksfunktionen. [6] H. Herold, W. Unger C - Gesamtwerk tewi, 1988, ca. 79.- DM Compilerunabhängiges Werk, das viele Beispiele und Erläuterungen enthält. Auch kompliziertere Datenstrukturen und etwas weiter führende Programmierungstechnik werden dargestellt. [7] Uwe Repplinger Turbo C++ - Einführung und Leitfaden Addison Welsey, 1991 Ein Nachschlagwerk und Handbucherergänzung, Übersicht über Bibliotheksfunktionen. Der C-Grundumfang wird erläutert. 311 312 LITERATURVERZEICHNIS [8] Guido Krüger C - Programmierung Addison Wesley, 1991, ca. 69.- DM Ist mit vielen Trainingsaufgaben zum vertiefenden Selbststudium geeignet. [9] Brian W. Kernigan, Dennis Ritchie Programmieren in C Hanser und Prentice-Hall, 2.Aufl. 1990, ca. 56.- DM Der Klassiker und allgemeine Referenzquelle, 2.Auflage hat ANSI berücksichtigt, ist eher Unix-bezogen. [10] Robert Sedgewick Algorithmen in C Addison-Wesley, 1992, ca. 90.- DM Ein leicht verständliches, umfangreiches und modernes (Nachschlage-) Werk über Algorithmen, Datenstrukturen und Programmiermethoden. [11] Matthias Clauss, Guenther Fischer Programmieren mit C Hüthig, 1989, ca. 48.- DM Unix-orientiert werden vor allen komplexe Verfahren erläutert, nach knapper Einführung mit exakter Begriffsbildung wird etwas Informatik- und Programmierwissen vorausgesetzt. [12] L.H. Miller, A.E. Quilici C in der Praxis Oldenbourg, 2.Auflage 1990, ca. 68.- DM Sehr ausführliche Darstellung der C-Elemente und Datenstrukturen, nicht auf Borland-C bezogen. [13] Harry Feldmann Strukturiertes Programmieren in C Vieweg, 1992, ca. 50.- DM Dieses Buch orientiert sich stark an ADA-ähnlichem Stil der Strukturierung. Handbüchersätze Microsoft/Borland usw. sind fast unverzichtbar beim konkreten Umgang mit einem der Compiler. LITERATURVERZEICHNIS Weiterführende Bücher von C++ : [14] Walter Herglotz C++ Grundlagen objektorientierter Programmierung BHV, 1991, ca. 20.- DM [15] Stanley B. Lippman C++ Einführung und Leitfaden Addison-Wesley, 2.Aufl. 1991, ca. 89.- DM [16] Martin Aupperle Objektorientiert mit Turbo C++ Vieweg, 1992 313