Sprachen / C / Strings

Strings

Größen und Längen

Strings/strings_und_laengen
#include 
#include 

int main()
{
  char a_ab[] = "ab";
  printf("a_ab = %s\n",a_ab);
  for(int i = 0; i < sizeof(a_ab);i++)
    printf("%d = %c ", a_ab[i], a_ab[i]);
  puts("\n");
    
  char *z_abcde = "abcde"; 
  printf("z_abcde = %s\n",z_abcde);
  for(int i = 0; i < sizeof(z_abcde);i++)
    printf("%d = %c ", z_abcde[i], z_abcde[i]);
  puts("// \"falsche\" Groesse wurde ermittelt.\n");
    
  printf("z_abc = %s\n",z_abcde);
  for(int i = 0; i < strlen(z_abcde);i++)
    printf("%d = %c ", z_abcde[i], z_abcde[i]);
  puts("// \"richtige\" Groesse wurde ermittelt."); 
    
  printf("\nsize of a_ab = %d, sizeof z_abcde = %d\n", \
    sizeof(a_ab), sizeof(z_abcde));
   
  printf("\nstrlen of a_ab = %d, strlen of z_abcde = %d\n", \
    strlen(a_ab), strlen(z_abcde));
               
  return 0;
} 
      
a_ab = ab
97 = a 98 = b 0 =  

z_abcde = abcde
97 = a 98 = b 99 = c 100 = d // "falsche" Groesse wurde ermittelt.

z_abc = abcde
97 = a 98 = b 99 = c 100 = d 101 = e // "richtige" Groesse wurde ermittelt.

size of a_ab = 3, sizeof z_abcde = 4

strlen of a_ab = 2, strlen of z_abcde = 5

Der Datei strings_und_laengen.c kann folgendes entnommen werden. Es gibt zwei verschiedene Wege Strings zu deklarieren. Man kann die Arrayschreibweise verwenden oder die Zeigerschreibweise. Jeder String endet immer mit dem Nullzeichen, also mit '\0'. Diesen kann man zwar nicht direkt sehen, aber man kann dessen Spuren erkennen: Die 3 Schleifen geben jeweils das ASCII-Zeichen und das dazugehörige Zeichen vom String sukzessive wieder. a_ab besteht nur aus 2 Zeichen und dem Nullzeichen (ASCII-Wert == 0), also aus insgesamt 3 Byte.

sizof() wertet den Arraybezeichner wie erwartet aus, doch nicht so beim Pointer (z_abcde) (zumindest für die Nicht-C-Kenner). In diesem Fall wird die Größe des Zeigers (auf den meisten Machinen 4 Byte) ausgegeben. Der Grund dafür ist folgender: sizeof() ermittelt zur Laufzeit die Speichergröße und da der Speicherbereich von Zeigern dynamisch (während der Laufzeit) wachsen kann, kann er deswegen nicht zur Laufzeit ermittelt werden. Für a_ab geht das, weil diese Variable eine vorher fest definierte Größe hat. Für z_abcde gilt das jedoch nicht.

strlen() hingegen ermittelt die Stringlänge zur Laufzeit, weswegen diese Funktion zur Ermittlung der Stringlänge (bei Pointer, aber auch bei char-Arrays) immer verwendet werden sollte. Zu Beachten wäre aber noch, dass der Nullpointer nicht mitgezählt wird.

Deklarierungs- und Initialisierungsmöglichkeiten

Strings/dekla_und_ini_moeg
#include 
#include 
#include 

int main()
{
  char vari_1[7] = {'S','i','l','b','e','r','\0'};
  char vari_2[7] = "Silber";
  char vari_3[] = "Silber";
  char *vari_4 = "Silber";
    
  if  
  (
    !strcmp(vari_1,vari_2) && 
    !strcmp(vari_2,vari_2) &&
    !strcmp(vari_3,vari_4)
  )    
    puts("Alle Strings sind gleich");
  else 
    puts("Es sind nicht alle Strings gleich");
    
  return 0;
} 
      
Alle Strings sind gleich
Autor: behalx
Erstellt am: 17.01.2010
Zuletzt modifiziert: 20.04.2011
Lizenz:
Creative Commons License