Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » [Anfängerproblem] Einlesen eines Arrays/Break

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ]
000
15.04.2004, 19:18 Uhr
DerSchwarzeSchlumpf



hi

ich weiß die c++-gurus werden sich darüber totlachen, aber egal *g*

bin gerade an meinem ersten c++-programm (einem labyrinth mit start/zielpunkt wo halt der ausgang gefunden werden soll *g*).

das einlesen das labyrinths geschieht zeile für zeile. zuvor wird das labyrinth nach den benutzereingaben erstellt (dh er gibt die anzahl der reihen (rows) und die anzahl der lemente (columns) ein).

mein problem: ich reserviere für die einzelnen row-arrays genau soviel speicher wie es column elemente gibt. nur wenn einer jetzt so gescheit ist und das labyrinth für 10 columns erstellt, dann aber 15 eingibt, schmiert das ganze programm natürlich ab. alternativ "einfach doppelt soviel speicher reservieren" geht leider nicht weil die auf der uni das mit werten um 1.000.000 und mehr oder so testen *g*

in c hab ich folgende getchar()-funktion dafür verwendet:

C++:
while((user_input = getchar()) != '\n')
{
  *array_helper = user_input;
  counter++;
  array_helper++;

  if(counter >= RESERVED COLUMN)
    break;
}



das hat super funktioniert nur in c++ geht das anscheinend nicht *g*

derzeit lese ich das array mit cin.getline() ein aber da kann man so ein break-statement aber nicht einbringen, oder?

wär echt klasse wenn jemand einen ratschlag hätte *g*

liebe grüße

ein softwareentwickler im 2. semester *gg*

Bearbeitung von Pablo:

CPP Tags gesetzt


Dieser Post wurde am 15.04.2004 um 19:28 Uhr von Pablo editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
15.04.2004, 20:00 Uhr
Guybrush Threepwood
Gefürchteter Pirat
(Operator)


warum soll das nicht gehen?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
15.04.2004, 21:52 Uhr
hannibal



du kannst in c++ c-libs genauso verwenden..mach ich auch, da mir die ganzen stream-libs nicht geheuer sind :x
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
15.04.2004, 22:27 Uhr
DerSchwarzeSchlumpf




Zitat:
Guybrush Threepwood postete
warum soll das nicht gehen?


tjo des frag' ich mich auch gerade *gg*

der code schaut jetzt so aus:


C++:

  int column = MyMatrix->GetMatrixColumn();

  //reserved column + 2 because: 0 is also possible for array + '\0' char
  char* labyrinth_line = new char[column+2];
  
  char* labyrinth_line_helper = labyrinth_line;
  char input_char = '\0';
  int number_chars = 0;

  //cin.getline(labyrinth_line, column+1, '\n');

  while((input_char = getchar()) != '\n')
  {
    *labyrinth_line_helper = input_char;
    number_chars++;
    labyrinth_line_helper++;
    
    if(number_chars >= column)
      break;
  }




aber das problem: er liest mir trotzdem immer mehr zeichen ein und das break scheint irgendwie wirkungslos und erfüllt den zweck irgendwie nicht.

hab mir gedacht vielleicht liegts an den #includes. derzeit hab ich folgende:

C++:

#include <iostream>
#include <string.h>
#include "stdlib.h"
#include "stdio.h"

Dieser Post wurde am 15.04.2004 um 22:28 Uhr von DerSchwarzeSchlumpf editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
16.04.2004, 02:32 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


eventuell hilft dir das und das hier weiter...
ist zwar nicht ganz genau deine aufgaben stellung aber gibt dir vielleicht schon mal einen ansatz
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
16.04.2004, 12:50 Uhr
DerSchwarzeSchlumpf




Zitat:
Windalf postete
eventuell hilft dir das und das hier weiter...
ist zwar nicht ganz genau deine aufgaben stellung aber gibt dir vielleicht schon mal einen ansatz



hi

danke erstmal (: aber nee das ganze labyrinth selbst funktioniert ohne probleme (erstellen, ausgang setzen, mauer setzen, ausgabeformat ändern usw usw) *gg*

das problem ist: die befehlseingabe für das "labyrinth setzen" muss so ausschaun:


C++:
d // für definiere labyrinth, dann enter
10 5 //2 uint32 werte (wird auch überprüft ob eingabe negativ ist und erst nachher in ein uint32 umgewandelt *g*), geben an wie groß das labyrinth sein soll, dann wieder enter

//so und jetzt kommt das problem. der benutzer muss jetzt 5x (soviele reihen gibt es) jeh 10 x eingeben, ob es eine mauer, startpunkt, zielpunkt oder freies feld gibt. S = Startpunkt, Z=ZIelpunkt, "Leerzeichen" = freies feld, o = Mauer.

//Das sieht dann im detail so aus

oooooooooS //10 Elemente, dann enter
o             o //10 Elemente, dann enter
ooo     oooo // 10 Elemente, dann enter
ooo     oooo //10 Elemente dann enter
oooZ  ooooo // 10 Elemente, dann enter

// das einlesen hab ich bis jetzt mit cin.getline() gemacht.
// das Problem ist aber! ich habe jetzt pro reihe für genau 11 Zeichen (10
//Elemente + '\0' char) speicher reserviert. Nur was ist wenn der DAU jetzt
//stattdessen 15 Zeichen eingeben will? Klar => er stürzt ma ab *g* und
//daher bräuchte ich da irgendwie eine Beschränkung wie mand as umgehen kann



hat da jemand eine idee wie das funktioniert dass ab der 10. eingabe ganz einfach keine zusätzliche eingabe mehr möglich ist?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
16.04.2004, 13:02 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


Wie willst du das Teil von Hand eingeben lassen?
Das ist ja krank... Lies das Teil lieber immer von ner datei ein, dann kannst du es wenigstens wiederverwenden...
wirst ja sonst wahnsinnig wenn man das immer von hand einlesen muss...
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
16.04.2004, 14:33 Uhr
DerSchwarzeSchlumpf




Zitat:
Windalf postete
Wie willst du das Teil von Hand eingeben lassen?
Das ist ja krank... Lies das Teil lieber immer von ner datei ein, dann kannst du es wenigstens wiederverwenden...
wirst ja sonst wahnsinnig wenn man das immer von hand einlesen muss...



hi

ja würd ich gerne machen *gg*

nur is das eins von den 2 Projekten die ich in diesem Semester machen muss uuuuuund die lieben Uni-Profs wollen die eingabe so *g* die lesen das dann selbstverständlcih ein vorgefertigtes .txt ein wo sie dann die ausgabe mit der erwarteten ausgabe überprüfen *g*

nur ich muss das leider so implementieren

hat jemand eine idee wie ich den schutz einbaue? *gg*
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
16.04.2004, 14:47 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


einfach in ein grösseres array einlesen, z.b. in einen std::string...
dann prüfst du ob die eingabe valide war und wenn nicht wirfst du dem benutzer eine fluchende Meldung entgegen (Man du dummer Pinguin oder sowas...)
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
16.04.2004, 15:12 Uhr
DerSchwarzeSchlumpf




Zitat:
Windalf postete
einfach in ein grösseres array einlesen, z.b. in einen std::string...
dann prüfst du ob die eingabe valide war und wenn nicht wirfst du dem benutzer eine fluchende Meldung entgegen (Man du dummer Pinguin oder sowas...)



hi

jo sowas hab ich mir auch schon gedacht.

derzeit tendier ich aber zu einer anderen lösung. hab grad bei mdsn mal geschaut was es bei cin für möglichkeiten gibt und bin hier auf folgendes gestoßen:


C++:
The get Function
The unformatted get member function works like the >> operator with two exceptions. First, the get function includes white-space characters, whereas the extractor excludes white space when the ios::skipws flag is set (the default). Second, the get function is less likely to cause a tied output stream (cout, for example) to be flushed.

A variation of the get function specifies a buffer address and the maximum number of characters to read. This is useful for limiting the number of characters sent to a specific variable, as this example shows:

#include <iostream.h>

void main()
{
   char line[25];
   cout << " Type a line terminated by carriage return\n>";
   cin.get( line, 25 );
   cout << ' ' << line;
}

In this example, you can type up to 24 characters and a terminating character. Any remaining characters can be extracted later.

The getline Function
The getline member function is similar to the get function. Both functions allow a third argument that specifies the terminating character for input. The default value is the newline character. Both functions reserve one character for the required terminating character. However, get leaves the terminating character in the stream and getline removes the terminating character.

The following example specifies a terminating character for the input stream:

#include <iostream.h>

void main()
{
   char line[100];
   cout << " Type a line terminated by 't'" << endl;
   cin.getline( line, 100, 't' );
   cout << line;
}



da könnte ich ja einfach so ein trash-array (char* wastepaper-basket[256]) erstellen wo die restlichen zeichen ganz einfach automatisch eingelesen werden und dann wegeschmissen werden.

die frage is nur: wie kann ich jetzt feststellen ob mehr zeichen eingegeben wurden und das trash-array gebraucht wurde? *gg*
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: