Sven: Einen einfachen String deklarieren

Hallo,

seid einigen Stunden bin ich nur auf der suche nach einem Deutschen Anfängerkurs für C, mal hin und wieder finde ich auch Codeabschnitte aber nicht wirklich was man gebrauch kann wenn man mit C anfängt zu Programmieren.
Die grunddinge kenne ich bereits:

int
:= Integerzahlen
float
:= Gleitkommazahlen
double
:= Gleitkommazahl mit doppelter Genauigkeit
short
:= kleine Integerzahl
long
:= große Integerzahl
unsigned := ohne Vorzeichen
signed
:= mit Vorzeichen (Weglasswert)

auch die if-anweisungen und for-schleifen etc. sind auch nicht gerade das Problem, das ähnelt ja sehr PHP mit der ich einige Jahre programmiert habe.
Aber ich habe noch ein paar Probleme mit dem Verständniss von dem Anzeigen den ablesen von eingaben.
In einem Codeabschnitt gab es folgendes beispiel:

int a;
printf("Gebe eine Zahl ein:");
scanf("%d",&a);

Ok, eigentlich ganz einfach aber was bedeutet das & zeichen an der Variable a? Und wieso das %d?
Ich weiß das dieses %d für eine Ganzzahl steht, aber wieso muss man dieses auch hier angeben?
Und wie kann ich eine String-Variable deklarieren?
Fragen über fragen..... ;)
Aber eines gibt es was ich nun echt nicht kapiere, in den Verschieden C beschreibungen sieht man mal dieses:

int main(void)
{
  anweisungen;
}

und mal so:

main
{
  anweisungen;
}

Warum mal int und void als argument und mal ohne?
Wozu?

Kann mir das einer sagen? Oder auf eine nette Deutsche anfänger Hilfe verweisen?

#include <eureHilfe.h>

;)

danke!

  1. Hallo,

    Ok, eigentlich ganz einfach aber was bedeutet das & zeichen an der Variable a? Und wieso das %d?

    & ist der Referenzoperator, d.H., dass hier die _Adresse_ einer Variable übergeben wird, wo der Wert dann hingeschrieben wird. C ist nun mal hardwarenaher, als andere Programmiersprachen.

    Ich weiß das dieses %d für eine Ganzzahl steht, aber wieso muss man dieses auch hier angeben?

    Überlege dir mal genau, was Werte in Variablen im Endeffekt sind: Eine endliche Reihe von Nullen und Einsen. C weiß nicht, dass diese Nullen und Einsen nun ein Integer sein soll. Diese Nullen und Einsen sind also verschieden interpretierbar. Dieses kleine Programm verdeutlicht dies:

      
    #include <stdio.h>  
      
    int main(void)   {  
        char var;  
        scanf("%c", &var);  
        printf("var als Zahl = %d\n", var);  
        printf("var als Zeichen = %c\n", var);  
      
    return 0;  
    }  
    
    

    Gib doch mal ein einfaches Zeichen, z.B. ein D ein, nachdem du das Programm gestartet hast.

    Und wie kann ich eine String-Variable deklarieren?

    So etwas gibt es in C nicht. Strings sind einfach Zeichenarrays mit einem abschließenden \0. Da dir C viele Freiheiten (zum Nachteil der Sicherheit) bietet, musst du nun mal desöfteren Hand anlegen, um "grundlegende" Dinge, wie Strings erledigen zu können.

      
    #include <stdio.h>  
      
    int main(void)   {  
      
        char string[] = "Das ist ein String";  
        printf("%s\n", string);  
      
    return 0;  
    }  
    
    

    Der Compiler weiß, wie groß das Array sein muss, und fügt beim Kompilieren noch das abschließende \0 hinzu.

    int main(void)
    {
      anweisungen;
    }

    und mal so:

    main
    {
      anweisungen;
    }

    Warum mal int und void als argument und mal ohne?

    Ich würde int main(void) als richtig bezeichnen, denn jedes Programm sollte an das aufrufende Betriebssystem zurückliefern, ob es erfolreich ausgeführt wurde, oder nicht, was mit "return 0" am Schluss der Main-Funktion bewerkstelligt wird. Da 0 ein Int ist, heißt es "int main(void)", da main ein "int" zurückliefert.

    Markus

    1. Hallo Markus,

      ich danke dir für deine ausführliche Hilfe, das hat mir die dinge doch schon näher gelegt.
      Da du sehr viel ahnung von C hast, kannst du mir evtl. eine kostenlose Docu (als PDF) etc. in Deutsch nennen die irgendwo in den tiefen des www´s liegen und nur darauf warten gelesen zu werden? ;)

      Achso, nur eine frage am rande, kann ich mit C auch shell-befehle ausführen und mir deren ergebniss liefern lassen?
      Das würde mich als Linux User sehr brennend Interessieren!
      Danke && ein schönes Wochenende.

      Meine ersten Programmier-geh-versuche mit C schiebe ich erstmal in /dev/null ;) und halte mich an deine erklärung.

      Bis dann!

      1. Hallo,

        Da du sehr viel ahnung von C hast, kannst du mir evtl. eine kostenlose Docu (als PDF) etc. in Deutsch nennen die irgendwo in den tiefen des www´s liegen und nur darauf warten gelesen zu werden? ;)

        Mit C habe ich eigentlich nur aus Interesse so nebenbei beschäftigt. DER Profi bin ich also auch nicht. Außerdem glaube ich, dass du mit C++ glücklicher sein würdest, da es viele Vereinfachungen bietet, und das bei größerem Funktionsumfang, z.B. Objektorientiertes Programmieren, aber die Entscheidung liegt natürlich bei dir. Ich würde sagen, dass die Open-Books auf pronix.de eine sehr gute C-Referenz sind. Zumindest haben sie mir in der Vergangenheit oft geholfen.

        Achso, nur eine frage am rande, kann ich mit C auch shell-befehle ausführen und mir deren ergebniss liefern lassen?

        Mit C kannst du in deinem System herumfuhrwerken, wie du willst. Das ist ja das Schöne an C. :)
        Mit "system" kannst du übrigens Systembefehle ausführen, z.B. system("ls -al");

        Markus

        1. Moin!

          Mit C kannst du in deinem System herumfuhrwerken, wie du willst. Das ist ja das Schöne an C. :)

          Wie der Zufall (?) es so will, ist Linux ja größtenteils in C geschrieben.

          Mit "system" kannst du übrigens Systembefehle ausführen, z.B. system("ls -al");

          Und der Rückgabewert von system() sagt dir, ob der Befehl erfolgreich ausgeführt werden konnte.

          Außerdem könnte dir noch die exec-Familie weiterhelfen (man 3 exec).

          Viele Grüße,
          Robert

      2. Hallo Sven.

        Da du sehr viel ahnung von C hast, kannst du mir evtl. eine kostenlose Docu (als PDF) etc. in Deutsch nennen die irgendwo in den tiefen des www´s liegen und nur darauf warten gelesen zu werden? ;)

        Meiner Meinung nach DAS Einführungswerk schlechthin: C von A bis Z.

        Einen schönen Samstag noch.

        Gruß, Mathias

        --
        ie:% fl:| br:< va:) ls:& fo:) rl:( n4:~ ss:) de:] js:| mo:| zu:)
        debian/rules
  2. Hi,

    Aber ich habe noch ein paar Probleme mit dem Verständniss von dem Anzeigen den ablesen von eingaben.
    In einem Codeabschnitt gab es folgendes beispiel:

    int a;
    printf("Gebe eine Zahl ein:");
    scanf("%d",&a);

    Ok, eigentlich ganz einfach aber was bedeutet das & zeichen an der Variable a? Und wieso das %d?
    Ich weiß das dieses %d für eine Ganzzahl steht, aber wieso muss man dieses auch hier angeben?

    Der & operator steht für die Adresse der Variablen.
    Wenn du eine normale Variable an eine Funktion übergibst wird von dieser Variablen innerhalb der Funktion nur eine lokale Kopie angelegt, und diese Kopie kann die Variable in der rufenden Funktion (hier scanf) nicht beeinflussen. Darum musst du hier die Adresse übergeben, damit in der Funktion direkt an die Speicheradresse geschrieben werden kann, an der die Variable steht.

    Das %d brauchst du, um anzugeben, was eingegeben wird. Wenn du Beispielsweise 5 eingibst wird dies als 5 in die Variable abgespeichert. Wäre die Formatangabe jedoch %c anstatt %d würde der Ascii-Code von 5 (= 53) abgespeichert.

    Und wie kann ich eine String-Variable deklarieren?
    Fragen über fragen..... ;)

    Den Datentyp String gibt es in C (im Gegensatz zu C++, wo man hierfür eine Klasse includieren kann) nicht. Hier musst die Zeichenkette in einzelne Character Variablen schreiben. Die Einfachste möglichkeit hierzu ist es, ein char-Array anzulegen, in das du dann die einzelnen Buchstaben schreibst. Hierfür gibt es auch Funktionen. Der Nachteil hiervon ist, dass du bereits beim Initialisieren die Länge des Arrays angeben musst. Wenn du diese nicht weisst kannst du entweder einen extrem Großen Wert angeben, der nie erreicht wird, oder eleganter (aber am Anfang auch etwas komplizierter) einen char-Pointer verwenden und dann mit dynamischer Speicherverwaltung vor jeder Änderung den benötigten speicherplatz zuzuweisen.

    Aber eines gibt es was ich nun echt nicht kapiere, in den Verschieden C beschreibungen sieht man mal dieses:

    int main(void)
    {
      anweisungen;
    }

    und mal so:

    main
    {
      anweisungen;
    }

    Warum mal int und void als argument und mal ohne?
    Wozu?

    Die main Funktion ist immer der Hauptteil der Programms und wird immer zuerst angeführt. Das int davor gibt den Datentyp des Rückgabewerts der Funktion (bzw des Programms) an. Korrekter Weise sollte man immer das immer davor schreiben und am Ende von main "return 0;" schreiben. 0 sthet für erfolgreich ausgeführt.
    Ob man die runden Klammern unbedingt braucht weiß ich nicht, aber mit "(void)" bist du wohl auf der sicheren Seite. void heißt, dass main keine Argumente erwartet. Wenn du jedoch Werte an main übergeben willst musst du dies jedoch etwas anders schreiben, als beim Aufruf von normalen Funktionen. Dies sieht dann in etwa so aus:
    int main (int argc, char *argv[])

    Kann mir das einer sagen? Oder auf eine nette Deutsche anfänger Hilfe verweisen?

    Sorry, hier kann ich dir leider auch nicht weiterhelfen.

    mfG,
    steckl

    1. Hi steckl,

      super, danke dir!
      Jetzt weiss ich auch was das mit dem void zu bedeuten hat!
      Doch dieses:
      int main (int argc, char *argv[])
      kapiere ich nicht ganz, sind dieses argc und argv Argumente deren namen ich frei wählen kann?
      Also so:
      int man (int argA, int argB, int argC)

      Oder wie muss man das verstehen?

      Danke!

      1. Hi,

        Doch dieses:
        int main (int argc, char *argv[])
        kapiere ich nicht ganz, sind dieses argc und argv Argumente deren namen ich frei wählen kann?

        Den Namen darfst du frei wählen, ja, aber du darfst die Funktion nicht verändern. Es gäbe auch keinen Grund, diese zu verändern, denn argc sagt dir, wieviele Argumente dem Programm übergeben wurde, wobei (Achtung!) der Programmname selbst das erste Argument ist, und argv ist ein Array von Zeigern auf char, mit dem du die per Kommandozeile übergebgenen Argumente bekommst. Wenn du dich mit Zeigern ausreichend beschäftigt hast, wirst du verstehen, warum das so funktioniert.
        Hier ein kleines Testprogramm:

          
        #include <stdio.h>  
          
        int main(int argc, char *argv[])   {  
          
           if (argv[1] != NULL)   {  
              printf("argc = %d argv = %s\n", argc, argv[1]);  
           }  
          
        return 0;  
        }  
        
        

        Rufst du dieses Programm nun mit ./programmname test auf, zeigt es dir sehr schön, dass du insgesamt 2 Argumente hast (Programmname und "test"), und, was in argv[1] steckt, nämlich das 2. Argument. argv[0] wäre der Programmname selbst.

        Markus

        1. Hi,

          super, das verstehe ich jetzt!
          Und danke nochmal für dein link, nun kann ich mich hemmungslos damit befassen!

          Bis dann!

          »»→→computer würden linux kaufen←←

      2. Moin!

        Doch dieses:
        int main (int argc, char *argv[])
        kapiere ich nicht ganz, sind dieses argc und argv Argumente deren namen ich frei wählen kann?

        Ja, du kannst auch schreiben

        int main(int anzahl_der_Argumente, char *kommandozeilen_Argumente[])

        Also so:
        int man (int argA, int argB, int argC)

        Nein, es sind nur die _Namen_ der Argumente frei wählbar, aber nicht deren Anzahl und Typen.

        Viele Grüße,
        Robert

      3. Hi,

        Doch dieses:
        int main (int argc, char *argv[])
        kapiere ich nicht ganz, sind dieses argc und argv Argumente deren namen ich frei wählen kann?
        Also so:
        int man (int argA, int argB, int argC)

        Oder wie muss man das verstehen?

        argc steht soweit ich weiß für argumenten counter. Hier wird die Anzahl der Argumente gespeichert, die an die Routine, bzw das Programm übergeben werden.

        argv is steht dann für argumenten vektor. es ist ein mehrdimensionales array, bzw. ein pointer-array, worin dann die einzelnen Argumente als strings abgespeichert werden.

        Hier steht beschrieben, wie du das anwenden kannst.

        Aber ich würde mich erstmal mit den einfacheren sachen wie Schleifen und selbstgeschriebenen Funktionen beschäftigen, bevor du dich in Pointer einarbeitest.

        mfG,
        steckl

  3. Moin!

    signed
    := mit Vorzeichen (Weglasswert)

    Das stimmt nicht ganz: Bei Zeichen (Datentyp char) gibt es auch signed char und unsigned char, wobei der Compiler vorgibt, was er als Standard ansieht.

    Aber ich habe noch ein paar Probleme mit dem Verständniss von dem Anzeigen den ablesen von eingaben.

    Damit kann man sich auch die größten Sicherheitsprobleme einhandeln.

    In einem Codeabschnitt gab es folgendes beispiel:

    int a;
    printf("Gebe eine Zahl ein:");
    scanf("%d",&a);

    Ich weiß jetzt nicht genau, welche Probleme es mit scanf so alles geben kann, aber Zahlen liest man sicherer so ein:

    int a;  
    char eingabe[1024];    /* 1024 sollten für eine Zahl reichen */  
      
    printf("Gebe eine Zahl ein:");  
    fgets(eingabe, sizeof(eingabe), stdin);  
      
    /* ältere, fehleranfällige Methode: */  
    a = atoi(eingabe);  
      
    /* besser: */  
    long b;  
    b = strtol(eingabe, NULL, 0);
    

    Viele Grüße,
    Robert