Arrays... :< (:



  • Danke!!! 👍

    Jedoch, kenne ich noch keine Klassen bzw. Objekte ( habe vorgestern mit "Programmieren" lernen, angefangen ), weshalb ich es auf meine Weise versuchen wollte.^^

    Die Codezeilen, haben auch keinen höheren Ziel, sondern dienen lediglich dazu, mich ausführlich mit den Arrays zu befassen. Von daher versuche ich, möglichst alles, selber zu lösen. Das war/ist meine Intention. Keine Ahnung, warum ich mir gerade sowas als Ziel gesetzt habe. Aber meine Neugierde bzgl. Realisierung, ist einfach zu groß. 😃

    ps: Es ist, wie du/ihr natürlich erraten habt, eine "Konsolenanwendung".
    Einfach die Codezeilen compilieren, dann könnt ihr wahrscheinlich eher nachvollziehen, was ich hiermit...

    /*Wenn ich die Vertikale in eine lange Reihe, richtung Horizont x-fach wiederholen lassen möchte, muss ich...
                cout << "" << strings_5[index_char];
                cout << "" << strings_5[index_char];
                cout << "" << strings_5[index_char];
                .
                .
                .
                cout << "" << strings_5[index_char] << endl;
    
              ... eingeben?!?...
              Wie kann ich das mit einer Schleife lösen???
            */
    

    ... bezwecke.^^



  • nImA87 schrieb:

    //Hier werden die einzelnen Zeichen, vom Benutzer bestimmt
    	for (index_char = 0;index_char != 5;index_char++)
    	{
    		cin >> strings_5[index_char];		
    	}	
    	/*
    	--->>>>	Was muss ich machen, damit er sich auch mit weniger als 5 Zeichen zufrieden gibt.
    	Habe schon '\n' als escape-bedingung versucht :)
    	*/
    

    Wenn er bei '\n' abbrechen soll musst du ihm das auch sagen:

    for (int i = 0; i < 5; i++){
        cin >> strings_5[i];
        if (strings_5[i] == '\n')
            break;
    }
    

    Du solltest das aber überspringen und gleich string und getline usw. benutzen.

    C++ ist aus C entstanden, daher gibt es häufig mindestens zwei Wege etwas zu tun: Auf die C Art und auf die C++ Art. Es wird nicht gern gesehen wenn es vermischt wird.
    In der C-Welt sind strings char * (die aus einem char array entstehen können) mit einem '\0'-character als Endesymbol. Wenn du dich daran hälst kannst du einfach cout << strings_5 schreiben. Wenn du dich nicht daran hälst wird er auf der Suche nach dem '\0'-Zeichen irgendwelchen Blödsinn ausgeben oder abstürzen.
    Der C++-Weg ist std::string zu benutzen. Man kann zum Beispiel einen string aus einem char array bauen: std::string s(strings_5, strings_5 + 5); (wenn du kein '\0'-Zeichen am Ende hast) oder std::string s = strings_5; (wenn du ein '\0'-Zeichen am Ende hast) und dann mit cout << s; ausgeben. strings benutzen kein '\0' als Endemarkierung sondern merken sich ihre Größe.

    "" ist ein leerer C-String wo nur das '\0'-Zeichen drin steht. cout << "" tut nichts. cout << '\n' gibt ein newline aus. So richtig habe ich das mit der Vertikale nicht verstanden.



  • Rumspielen ist okay, aber besorg Dir ein Buch, das möglichst flott mit der Standardbibliothek anfängt.
    Wenn Du Zeichenkette denkst, musst Du string denken.
    Wenn Du Array denkst, musst Du vector denken.

    Es gibt so gut wie gar keinen Grund char[] zu benutzen.

    Ich glaube auch, dass es mehr Spaß macht, gleich richtige Programme zu schreiben als gekünstelten Kram, von dem jeder sagt: "In der Realität würde das niemand so machen!".

    #include <string>
    #include <iostream>
    
    void print_vert(const std::string s, int n){
      for(auto c : s) // fuer jeden Buchstaben c in s
        std::cout << std::string(n, c) << '\n'; // gib einen string mit n wiederholungen von c aus
    }
    
    int main(){
      std::string s="Hallo, Welt";
      print_vert(s, 10);
    }
    


  • Nur falls du (warum auch immer) char-Arrays nehmen musst:

    C++ kennt noch als Erbe von C die C-Strings.
    Das sind char-Arrays, wo das Ende vom Text durch das Zeichen '\0' ( = 0) gekennzeichnet wird. Man spricht da von Nullterminiert.

    Die meisten Funktionen gehen bei einem char-Array von so einem C-String aus. Auch cin und cout
    Das Problem ist, das die Funktionen keine Kenntnis über die Größe des Arrays haben. (Wenn du die Größe nicht extra angibst)
    Darum mach das Array ausreichend groß. 5 ist wirklich sehr sehr wenig.

    char strings_5[1000] = "";  // Leerstring
    //oder
    char strings_5[1000] = "Hallo Welt!";
    

    (Beachte, dass du diese Art zuweisung nur bei der Definiton machen kannst)

    nImA87 schrieb:

    Was muss ich machen, damit er sich auch mit weniger als 5 Zeichen zufrieden gibt.
    Habe schon '\n' als escape-bedingung versucht 🙂

    Wie hast du das versucht? aus einer Schleife kommt man mit break raus.
    Aber du musst die Zeichen nicht einzeln einlesen.

    nImA87 schrieb:

    /*Wenn ich die Vertikale in eine lange Reihe, richtung Horizont x-fach wiederholen lassen möchte, muss ich...

    Eine Schleife, die x Durchläufe hat. for bietet sich da an.

    for (index_char = 0; strings_5[index_char] != '\0'; index_char++) // Solange das Zeichen ungelich '}' ist
      { for (int ix = 0; ix < x; ++ix)
          cout << "" << strings_5[index_char];
        cout << endl;
      }
    

    Wenn es keinen guten Grund* für char-Arrays gibt, dann nimm std::string

    *Vorgabe vom Lehrer ist kein guter Grund, aber leider eine der Ausnahmen.



  • nImA87 schrieb:

    Danke!!! 👍

    Jedoch, kenne ich noch keine Klassen bzw. Objekte ( habe vorgestern mit "Programmieren" lernen, angefangen ), weshalb ich es auf meine Weise versuchen wollte.^^

    Die Codezeilen, haben auch keinen höheren Ziel, sondern dienen lediglich dazu, mich ausführlich mit den Arrays zu befassen. Von daher versuche ich, möglichst alles, selber zu lösen. Das war/ist meine Intention. Keine Ahnung, warum ich mir gerade sowas als Ziel gesetzt habe. Aber meine Neugierde bzgl. Realisierung, ist einfach zu groß. 😃

    ps: Es ist, wie du/ihr natürlich erraten habt, eine "Konsolenanwendung".
    Einfach die Codezeilen compilieren, dann könnt ihr wahrscheinlich eher nachvollziehen, was ich hiermit...

    /*Wenn ich die Vertikale in eine lange Reihe, richtung Horizont x-fach wiederholen lassen möchte, muss ich...
                cout << "" << strings_5[index_char];
                cout << "" << strings_5[index_char];
                cout << "" << strings_5[index_char];
                .
                .
                .
                cout << "" << strings_5[index_char] << endl;
     
              ... eingeben?!?...
              Wie kann ich das mit einer Schleife lösen???
            */
    

    ... bezwecke.^^

    Habe nun die einfache Loesung, da ich jetzt mehrdimensionale Arrays kennengelernt habe. :p

    @DirkB
    Strings sind doch nichts anderes als char-Arrays oder habe ich da etwas falsch verstanden? 😕

    @FurbleWurble
    Ich moechte auch zuerst die Grundlagen wirklich verstehen und verinnerlichen.
    Und nein ich langweile mich noch nicht, da ich mich 3-4 Stunden am Tag damit beschaeftige und somit nicht vom Lernen uebersaettigt bin. Studium beginnt erst in Okt. 14.
    Mein großes naestes Ziel ist, ein Snakespiel mittels SFML zu programmieren.
    Aber vorher moechte ich, Arrays, Zeiger und Klassen verstanden haben und anwenden koennen, ohne staendig im Internet nachschlagen zu muessen.

    ps: Danke fuer die vielen Tipps! 👍 Die waren ALLE sehr hilfreich! 💡



  • nImA87 schrieb:

    Strings sind doch nichts anderes als char-Arrays oder habe ich da etwas falsch verstanden? 😕

    Strings (oder auf deutsch Zeichenketten) dienen zur Verarbeitung von (vielen/zusammenhängenden) Zeichen.

    In C hat man sich dafür auf nullterminierte* char -Arrays geeinigt.
    (Es ist nur eine Vereinbarung, aber darauf baut auch die C-Standardlibrary auf)
    Arrays haben einige Nachteile. Du kannst die Größe im nachhinein nicht mehr ändern und auch schlecht bestimmen.
    Daher kann es vorkommen, dass man über die Grenzen des Arrays zugreift, wenn man nicht extrem aufpasst.

    Darum hat man in C++ die Klasse string eingeführt.
    Diese hat die Nachteile nicht mehr.

    *das ist wichtig und darf nicht vergessen werden


  • Mod

    Du kannst die Größe [...] schlecht bestimmen.

    Was soll das denn heißen?

    Daher kann es vorkommen, dass man über die Grenzen des Arrays zugreift, wenn man nicht extrem aufpasst.

    Dieser Punkt ist falsch - und träfe sowieso auf string und normale Arrays gleichzeitig zu, wodurch er keinen Nachteil von Arrays gegenüber string darstellt.



  • Arcoth schrieb:

    Du kannst die Größe [...] schlecht bestimmen.

    Was soll das denn heißen?

    Wenn du ein char [] nimmst um den Namen von Leuten einzulesen kannst du schwer festlegen wie lang das Array sein soll. 32? 128? 1024? Es ist immer ein Kompromiss aus Sicherheit und Verschwendung. string hat das Problem nicht, sondern wird so groß wie nötig.

    Gleiches für den zweiten Punkt, man kann bei string immer irgendwas per += dranhängen, bei Arrays muss man aufpassen dass es nicht zu viel wird.



  • cout << "" << strings_5[index_char] << endl;
    

    kann man auch durch:

    cout << strings_5[index_char] << endl;
    

    ersetzten, nur ein kleiner Tipp 😉



  • LightBoom schrieb:

    cout << "" << strings_5[index_char] << endl;
    

    kann man auch durch:

    cout << strings_5[index_char] << endl;
    

    ersetzten, nur ein kleiner Tipp 😉

    kann man auch durch:

    cout << index_char[strings_5] << endl;
    

    ersetzen.... 😉



  • Synonym schrieb:

    LightBoom schrieb:

    cout << "" << strings_5[index_char] << endl;
    

    kann man auch durch:

    cout << strings_5[index_char] << endl;
    

    ersetzten, nur ein kleiner Tipp 😉

    kann man auch durch:

    cout << index_char[strings_5] << endl;
    

    ersetzen.... 😉

    Meinte damit das man kein "" reinschreiben muss 😉 🙂



  • DirkB schrieb:

    nImA87 schrieb:

    Strings sind doch nichts anderes als char-Arrays oder habe ich da etwas falsch verstanden? 😕

    Strings (oder auf deutsch Zeichenketten) dienen zur Verarbeitung von (vielen/zusammenhängenden) Zeichen.

    In C hat man sich dafür auf nullterminierte* char -Arrays geeinigt.
    (Es ist nur eine Vereinbarung, aber darauf baut auch die C-Standardlibrary auf)
    Arrays haben einige Nachteile. Du kannst die Größe im nachhinein nicht mehr ändern und auch schlecht bestimmen.
    Daher kann es vorkommen, dass man über die Grenzen des Arrays zugreift, wenn man nicht extrem aufpasst.

    Darum hat man in C++ die Klasse string eingeführt.
    Diese hat die Nachteile nicht mehr.

    *das ist wichtig und darf nicht vergessen werden

    Ein C Programmierer baut sich soetwas einfach. 😉

    xxxx.h

    typedef struct {
    
    	char *ptrdynmem;			// memory
    	size_t dynmemlen;			// memory size
    	size_t intmembuflen;		// is only used internally!
    
    } DYNMEMVECTOR;
    
    typedef struct {
    
    	char *ptrdynstr;			// memory
    	size_t dynstrlen;			// memory size without zero term.
    	size_t intmembuflen;		// is only used internally!
    
    } DYNSTRVECTOR;
    

    xxxx.c

    #define MEMBUFSIZE 1024
    
    int DynMemCat(DYNMEMVECTOR *ptrdynmem ,const char *srcmem ,size_t srclen)
    {
    	size_t toallocsize = 0;
    	char *mem = NULL;
    
    	if(srcmem == 0)
    		return 0;
    
    	if(srclen > ptrdynmem->intmembuflen) {
    
    		toallocsize = srclen - ptrdynmem->intmembuflen;
    		mem = realloc(ptrdynmem->ptrdynmem ,ptrdynmem->intmembuflen+ptrdynmem->dynmemlen+toallocsize+MEMBUFSIZE);
    		if(mem == NULL)
    			return 0;
    
    		ptrdynmem->intmembuflen = MEMBUFSIZE;
    		ptrdynmem->ptrdynmem = mem;
    
    	} else {
    
    		ptrdynmem->intmembuflen -= srclen; 
    
    	}
    
    	memcpy(ptrdynmem->ptrdynmem+ptrdynmem->dynmemlen ,srcmem ,srclen);
    
    	ptrdynmem->dynmemlen += srclen;
    
    	return 1;
    }
    
    void FreeDynMemCat(DYNMEMVECTOR *ptrdynmem)
    {
    	ptrdynmem->dynmemlen = 0;
    	ptrdynmem->intmembuflen = 0;
    	free(ptrdynmem->ptrdynmem);
    	ptrdynmem->ptrdynmem = NULL;
    	return;
    }
    
    int DynStrCat(DYNSTRVECTOR *ptrdynstr ,const char *srcstr)
    {
    	size_t toallocsize = 0 ,srcstrlen = 0;
    	char *mem = NULL;
    
    	if( srcstr == NULL )
    		return 0;
    	if( *srcstr == 0 )
    		return 0;
    
    	srcstrlen  = strlen(srcstr);
    
    	if(srcstrlen > ptrdynstr->intmembuflen) {
    
    		toallocsize = srcstrlen - ptrdynstr->intmembuflen;
    		mem = realloc(ptrdynstr->ptrdynstr ,ptrdynstr->intmembuflen+ptrdynstr->dynstrlen+toallocsize+MEMBUFSIZE+1);
    		if(mem == NULL)
    			return 0;
    
    		ptrdynstr->intmembuflen = MEMBUFSIZE;
    		ptrdynstr->ptrdynstr = mem;
    
    	} else {
    
    		ptrdynstr->intmembuflen -= srcstrlen; 
    
    	}
    
    	memcpy(ptrdynstr->ptrdynstr+ptrdynstr->dynstrlen ,srcstr ,srcstrlen);
    
    	ptrdynstr->dynstrlen += srcstrlen;
    
    	ptrdynstr->ptrdynstr[ptrdynstr->dynstrlen] = '\0';
    
    	return 1;
    }
    
    void FreeDynStrCat(DYNSTRVECTOR *ptrdynstr)
    {
    	ptrdynstr->dynstrlen = 0;
    	ptrdynstr->intmembuflen = 0;
    	free(ptrdynstr->ptrdynstr);
    	ptrdynstr->ptrdynstr = NULL;
    	return;
    }
    


  • Hi,

    meint ihr nicht das so eine Diskussion für eine Anfängerfrage etwas zu weit geht(und verwirrt)?

    naja egal.
    Hier ein par links die dir bestimmt weiter helfen:
    http://de.wikibooks.org/wiki/C%2B%2B-Programmierung/_Inhaltsverzeichnis

    und speziell zu ein/ausgaben sowie schleifen:
    http://de.wikibooks.org/wiki/C%2B%2B-Programmierung/_Einführung_in_C%2B%2B/_Einfache_Ein-_und_Ausgabe
    http://de.wikibooks.org/wiki/C%2B%2B-Programmierung/_Einführung_in_C%2B%2B/_Schleifen

    und evtl auch noch das:
    http://www.cpp-entwicklung.de/cpplinux/cpp_main/node1.html

    MfG BabCom


Anmelden zum Antworten