string Problem mit strcmp

foexle

foexle

Kaiser
Sers Leute,

ich hätte da mal eine kleine frage, evtl weis das ja wer auf anhieb.

und zwar folgender aufruf:

Code:
char* kette[WERT], kette2[WERT];

             cout << "Bitte String 1 eingeben: ";
             for (int i = 0; i < WERT ; i++){
                     cin >> puffer;
                     kette[i] = new char[strlen(puffer)+1];
                     strncpy(kette[i], puffer, strlen(puffer)+1);


             }
        	 
             cout << "Bitte String 2 eingeben: ";
             for (int j = 0; j < WERT ; j++){
                     cin >> puffer;
                     kette2[i] = new char[strlen(puffer)+1];
                     strncpy(kette2[i], puffer, strlen(puffer)+1);


             }
das ist kein problem, der lagert nun den string den ich in der shell eingebe, in dem 2dim. array ab nun die frage
wie könnte ich das hinbekommen, das die standarteingabe cin die leerzeichen ignoriert und ich den kompletten string in ein 1dim. array bekomme?

also aus

asd asd rr

soll dann nich
[0] asd
[1] asd
[2] rr
werden

sondern
asdasdrr

könnte mir da wer weiterhelfen?

achja und ohne stringklasse muss mit zeigerarythmetik sein. also vektor verwenden ist nicht

mfg

falls ich ne info vergessen habe bitte fragen

mfg
 
Du hast übrigens eine buffer overflow-Schwachstelle drin, falls puffer ein char-Array ist(wonach es auch aussieht). Ich würde an deiner Stelle zeichenweise vorgehen und mit realloc arbeiten. Das könnte dann etwa so aussehen:
Code:
#include <iostream>
#include <stdlib.h>

using namespace std;

int main(int argc, char **argv)
{
	char *strings[2] = { NULL,NULL };
	for(int i=0;i<2;i++) {
		char c;
		int j=0;
		do {
			cin.get(c);
			if( c != ' ' ) {
				strings[i] = (char*)realloc(strings[i],j+2);
				strings[i][j++] = c;
			}
		} while( c != '\n' );
		strings[i][j] = 0;
		cout << "strings[" << i << "]: " << strings[i] << endl;	
	}
}
Die beiden Strings hast du dann in dem strings[]-Array.

Statt realloc könntest du natürlich auch delete und new verwenden, was imho aber umständlicher ist. Eine andere Optimierung wäre noch, jeweils größere Blöcke aufeinmal per realloc zu alloziieren und am Ende das Ganze zu kürzen, was ein wenig performanter wäre.

Allerdings bin ich weiterhin auf der Suche nach dem "string problem mit strcmp" aus dem Threadtitel, denn ein strcmp steht hier nirgends und wird auch nicht erwähnt. ;)
 
Zuletzt bearbeitet:
jo sry hab im code was vergessen ;) der titel war bissal überschnell gewählt, ich brauche das 1 dim array um ein strcmp mit 2 strings zu machen ... allerdings muss ich zuvor die leerzeichen raus bekommen

aber das mit dem cin.ignore ist ne gute idee das werde ich mal testen

dank euch beiden

-.- das mir das nicht selber eingefallen ist hmpf
 
Du hast übrigens eine buffer overflow-Schwachstelle drin, falls puffer ein char-Array ist(wonach es auch aussieht). Ich würde an deiner Stelle zeichenweise vorgehen und mit realloc arbeiten. Das könnte dann etwa so aussehen:
Code:
#include <iostream>
#include <stdlib.h>

using namespace std;

int main(int argc, char **argv)
{
	char *strings[2] = { NULL,NULL };
	for(int i=0;i<2;i++) {
		char c;
		int j=0;
		do {
			cin.get(c);
			if( c != ' ' ) {
				strings[i] = (char*)realloc(strings[i],j+2);
				strings[i][j++] = c;
			}
		} while( c != '\n' );
		strings[i][j] = 0;
		cout << "strings[" << i << "]: " << strings[i] << endl;	
	}
}
Die beiden Strings hast du dann in dem strings[]-Array.

Statt realloc könntest du natürlich auch delete und new verwenden, was imho aber umständlicher ist. Eine andere Optimierung wäre noch, jeweils größere Blöcke aufeinmal per realloc zu alloziieren und am Ende das Ganze zu kürzen, was ein wenig performanter wäre.

Allerdings bin ich weiterhin auf der Suche nach dem "string problem mit strcmp" aus dem Threadtitel, denn ein strcmp steht hier nirgends und wird auch nicht erwähnt. ;)

... ich bin mir nicht sicher.... aber verbraucht "realloc" nicht mehr Leistung des Systems als wenn man mit "new()" einmal deklariert?

Bin mir da einfach nicht sicher :D, kann mich natürlich auch total irren!
 
Die Sache ist, dass man im voraus nicht wissen kann, wieviel Speicher man denn nun benötigt. Daher reicht "mit new() einmal deklarieren" nicht immer aus. Ich habe schon erwähnt, dass es performanter ist, jeweils Blöcke von n Bytes zu reservieren, was die Anzahl der realloc()-Aufrufe(statt realloc() kann man auch new und delete nehmen, aber soweit ich weiß ist realloc in diesem Fall besser geeignet, da man lediglich ein vorhandenen Speicherblock vergrößern will) drastisch senken würde. Dies habe ich aber im Beispiel zwecks Übersichtlichkeit mal weggelassen.
 
Der Threadersteller wollte, dass zwei Strings eingelesen werden, daher wird das Array mit diesen zwei Strings auch mit 2 Werten initialisiert(char *strings[2]).
 
sind in deinem fall nicht

*string[0]
*string[1]
*string[2]

3 platzhalter vergeben? Und man kann alle doch auch mit char *string[] = { NULL } initalisieren.

Aber es ist ja nun auch nicht so wichtig^^. Problem gelöst und von daher! Man sieht sich ;)
 
Zu den 3 Platzhaltern: Nein. Die Zahl in den eckigen Klammern bei der Deklaration bezeichnet die Anzahl der Elemente in dem Array, nicht den höchsten Index(also strings[0] und strings[1] existieren, daher 2 Elemente).
Bei dem anderen Punkt habe ich mich geirrt, der Kompiler akzeptiert auch "char *strings[2] = { NULL };".
 

Ähnliche Themen

Problem mit Texteingabe

deprecated conversion from string constant to ‘char*’

nach einem String suchen und anschließend wert speichern

[PHP] Autologin-Funktion

Last mit etc/passwd anzeigen lassen

Zurück
Oben