Systemnahe Programmierung in Chome Systemnahe Programmierung in C: Felder und Zeichenreihen Prof. Dr. Uwe Schmidt FH Wedel

Felder und Zeichenreihen

weiter

weiter

char * und strings
Beispiel: stringTest.c

   1void
   2f (void)
   3{
   4  char str1[10] = "123456789";
   5  char *str2    = "abcdefghi";
   6  char *str3;
   7
   8  str1    = "not OK";
   9  str1[5] = 'A';
  10  str2[5]  = 'B';
  11  str2     = "OK";
  12  str2[5]  = 'C';
  13
  14  str3     = "OK";
  15  *str3    = "not OK";
  16
  17  str2     = "A";
  18  *str2    = 'a';
  19  *str2    = "A";
  20}
weiter

weiter

? Was ist hier falsch?


weiter

Übersetzen

cc -c -Wall stringTest.c

weiter

weiter

strlen
erste Beispiel-Implementierungen: strlen.c

   1
   2int
   3strlen1 (char str[])
   4{
   5  int i = 0;
   6
   7  while (str[i])          /* (str[i] != 0) */
   8    ++i;
   9
  10  return i;
  11}
  12
  13int
  14strlen2 (char str[])
  15{
  16  int i;
  17
  18  for (i = 0; str[i]++i);
  19
  20  return i;
  21}
  22
  23int
  24strlen3 (char *str)
  25{
  26  int i;
  27
  28  for (i = 0; *str++++i);
  29
  30  return i;
  31}
  32
  33int                       /* <-- problematisch */
  34strlen4 (char *str)
  35{
  36  char *ptr = str;
  37
  38  while (*ptr++);
  39
  40  return (ptr - str) - 1; /* <-- problematisch */
  41}
weiter

weiter

? Warum ist int als Resultattyp kritisch?


weiter

Übersetzen

cc -c -Wall strlen.c

weiter

weiter

vollständige Beispiele

mit Assembler-Code

weiter

weiter

strcpy-Versuche
erste Beispiel-Implementierungen: strcpy.c

   1void
   2strcpy1 (char d[]char s[])
   3{
   4  int i;
   5
   6  for (i = 0; s[i]i++)
   7    d[i] = s[i];
   8  d[i] = '\0';
   9}
  10
  11void
  12strcpy2 (char *dchar *s)
  13{
  14  while ((*d++ = *s++));
  15}
weiter

weiter

Übersetzen

cc -c -Wall strcpy.c

weiter

weiter

vollständige Beispiele

mit Assembler-Code

weiter

weiter

maschinenabhängige vordefinierte Datentypen

stdlib.h

weiter

weiter

vordefiniterte string-Funktionen

string.h

weiter

weiter

man pages

man strlen


man strcpy


man strcat


man strcmp


man --section 3 string


weiter

weiter

Beliebte Fehler bei der string-Verarbeitung
Beispiel: newString.c

   1#include <stdlib.h>
   2#include <string.h>
   3
   4char *
   5newString (char *s)
   6{
   7  char *res;
   8  res = malloc (strlen (s));
   9  if (!res)
  10    {
  11      exit (1);
  12    }
  13  return strcpy (ress);
  14}
weiter

weiter

? Welcher grobe Denkfehler ist in diesem Code enthalten?


weiter

Übersetzen

cc -c -Wall newString.c

weiter

Letzte Änderung: 14.12.2015
© Prof. Dr. Uwe Schmidt
Prof. Dr. Uwe Schmidt FH Wedel