Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Eingabe beliebig langer Zeichenketten

Empfohlene Antworten

Veröffentlicht

Folgendes Problem:

Es soll eine beliebig lange Zeichenkette, die auch Returns enthalten kann, eingegeben und in einer Variablen abgelegt werden.

Durch [Tab], [Enter] soll die Eingabe abgeschlossen sein.

Wer hat eine Idee, wie ich das machen könnte?

Als Variable wäre char* eigentlich geeignet (wegen Länge) - aber wie mach ich da bloß die Eingabeoperation :confused:

Oder gibt es da eine Möglichkeit mit einem variablen Array (aber wie geht das bloß???)

Die eingegebenen Zeichen sollten danach in eine Datei geschrieben werden.

Mit


ofstream Myfile

Myfile.open(path, ios::out|ios::nocreate|ios::binary, filebuf::sh_write);

greife ich auf die Datei zu.

Wer hat einen Tipp???

Gruß und schon mal vielen Dank

für alles was mich weiterbringt!

Technician

Original geschrieben von root@localhost

is aber dann nich so gut wenn im text mal ein tab und ein newline hintereinander sind!

Das kann in den Texten nicht vorkommen!

Es wären ja auch beliebig andere Zeichenfolgen möglich, die den Text abschließen!

Mir geht es ja nur darum, wie kann ich eine beliebig lange Zeichenfolge einlesen!

Ein Array mit z.B. 1000 Elementen erstellen - das will ich keinesfalls; bei den Texten die da eingegeben werden, können welche dabei sein die weit über 1000 Zeichen haben, aber auch welche mit nur einem Zeichen...

In ein char* etwas von Tastatur einlesen - das geht ja nicht, oder?

Gruß,

Technician

Original geschrieben von Daragon

Was eine Möglichkeit wäre, ist wenn du

die GUI nutzt und die Eingabe einfach

in nem Feld füllen läßt und dann mit

nem Click() auf nen Button mit der

Aufschrift "Senden" oder wie auch immer

dann die Daten in die Datei verschiebst.

Dann wäre auch das Problem mit den

Mehrfachen Returns etc. gelöst.

Ich möchte aber keine GUI erstellen, sondern ein reines Konsolenprogramm. (Außerdem, ich kenne mich mit GUIs unter C++ auch noch gar nicht aus.)

Mein Programm soll zur Demonstration des RSA-Algorithmus und evl. weiterer kryptografischer Algorithmen dienen.

Das mit den Returns ist wirklich egal.

Ich hab schon so gut wie alles gelöst was das Programm an sich angeht, arbeite aber derzeit noch mit einem 1000-Elemente-Array...

Original geschrieben von Daragon

Ich weiß jetzt nicht ob das funktioniert oder du das so machen willst:

Leg einfach ein ziemlich großes Array an,

was halt maximal rein gespeichert werden

kann oder halt ein ziemlich großes.

Dann nachdem die Eingabe erfolgt ist,

machst du ein strlen(), legst in der entsprechenden

Größe ein Array an, speichert deinen Text da

rein und löschst das alte Standart Array.

Das wäre die einzigste Lösung, die mir

einfällt.

Es ist nur die Frage ob du sowas machen

willst.

Darauf bin ich auch schon gekommen - wäre halt ein "Notbehelf".

Nur mich würde interessieren, ob es da nicht eine Möglichkeit gibt, das "direkt" zu lösen, denn ein "maximal" gibt es eben nicht.

Z.B. mit irgendwelchen variablen Arrays... weiß auch nicht genau...

Ich schließe aus Deinem Quelltext, daß Du C++ benutzt. In C++ gibt es die Klassen string und stringstream. Die kannst Du Dir ja mal ansehen, die organisieren den Speicherbedarf selber.

HTH

Jan

PS:

In ein char* etwas von Tastatur einlesen - das geht ja nicht, oder?
Das kann nicht gehen, weil Du für char* ja Speciher beschaffen mußt und Du letztendlich wieder beim Array-Problem bist

Jo Mann ich hab nen Plan wie das geht

Pass auf:

also ersmal ne Schleife, und dann ne eingabe

///////////////////////////////////

char Eingabe

char String[8192];

int count=0;

do{

Eingabe = getc(); //Liest ein Zeichen in die var Eingabe

if(Eingabe == 09) // Wenn Tabulatortaste gedrückt

{

String[count] = 0; //String abschliessen

break; // aus der schleife springen

}

else

{

String[count++] = Eingabe; //Die Eingabe in den String einfügen

printf("%c", Eingabe); // und Eingabe ausgeben

}

}while(1);

///////////////////////////////

Und was machts Du, wenn jemand mehr als 8192 Zeichen eingeben will? Dann hast Du ein Problem!

Ich empfehle weiterhin string und stringstream, die in Standard-C++ enthalten sind.

Jan

Original geschrieben von Orffi

Und was machts Du, wenn jemand mehr als 8192 Zeichen eingeben will? Dann hast Du ein Problem!

Genau das meinte ich ja!

Original geschrieben von Orffi

Ich empfehle weiterhin string und stringstream, die in Standard-C++ enthalten sind.

Werd mir dann heut abend mal stringstream zu Gemüte führen - und euch morgen von meinen (hoffentlich!) Erfolgen berichten!

Gruß und Danke,

Technician

Schon mal was von dynamischer Speicherverwaltung gehoert ;) ?

Du verwendest einen relativ kleinen Eingabepuffer (2KB zum Beispiel), ist dieser voll kopierst Du die Zeichen in deinen Zielpuffer den Du (beispielsweise mit "realloc") dynamisch anpasst. Das ganze machst Du solange in einer Schleife, bis das Abbruchkrieterium erreicht ist.

Nic

Original geschrieben von Crush

Der Speicher ist doch wohl wirklich nicht das Problem. Selbst bei 500 Anschlägen pro Minute schafft man am Tag kein Megabyte voll.

Man sollte aber dennoch sauber programmieren. Stell Dir nur einfach mal vor, die Zeichen kommen nicht von der Tastatur sondern aus einer Pipe. Ohne vernuenftige Speicherverwaltung faellt man da schnell auf die Nase.

Nic

Original geschrieben von nic_power

Schon mal was von dynamischer Speicherverwaltung gehoert ;) ?

Du verwendest einen relativ kleinen Eingabepuffer (2KB zum Beispiel), ist dieser voll kopierst Du die Zeichen in deinen Zielpuffer den Du (beispielsweise mit "realloc") dynamisch anpasst. Das ganze machst Du solange in einer Schleife, bis das Abbruchkrieterium erreicht ist.

Nic

Könntest du mir dazu ein Beispiel geben?

Gruß,

Technician

So, Problem Nummero Eins wäre damit gelöst:

Mit sstream kann ich beliebig lange Zeichenketten über die Tastatur einlesen:


#include <iostream>

#include <sstream>

using namespace std;


void main()

{

	string s = “123“;

	cin>>s;

	cout<<s;

}


Sooo, Texte beinhalten aber auch Leerzeichen. cin bricht aber bei einem Leerzeichen bekanntlich ab. cin.getline funktioniert nicht mit dem Datentyp string. Hmmmm, wie mach ich das jetzt, dass er über die Leerzeichen drüber weiterliest? Und nochwas: Die in string s eingelesenen Daten sollen in eine Datei geschrieben werden. Erstens habe ich festgestellt, nach dem Einbinden der string-Headerdatei wird file.open nicht mehr akzeptiert. Zweitens, wie werden string-Werte auf Datei geschrieben?

#include <iostream>

#include <sstream>

#include <string>

#include <conio.h>


#include <fstream>


using namespace std;


void main()

{

	char c = 'a';

	string s = "123";

	cin>>s;

	cout<<s<<endl;


	ofstream file;

	file.open("D:\\text.dat", ios::in|ios::nocreate|ios::binary,filebuf::sh_read);//error C2039: 'nocreate' : Ist kein Element von 'basic_ios<char,struct std::char_traits<char> >'

	/*if(file.good())

	{

		file.clear();

		file.close();


		file.open(path, ios::out|ios::nocreate|ios::binary, filebuf::sh_write);

		if(file.good())


file.write(myString, 10);	//hier ist der Knackpunkt – was setz ich dafür ein???

		file.close();

	};


*/


};


 

Wenn’s die string-Headerdatei schon gibt – dann muss sich da ja auch irgendwas auf Datei speichern lassen, oder?

Es sollte doch wohl nicht so sein, dass string-Werte auf ewig zu einer flüchtigen Existenz im RAM verdammt sind, oder?

:confused:

Gruß,

Technician

*hoffnungsvoll*

Archiv

Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.