String mit Doppelnamen einlesen und sortieren

Hallo,

Ich habe folgendes Problem.
Ich habe hier mein Programm, welches beliebig viele Namen einliest und sie dann sotiert.
Aber nun möchte ich , dass dieses Programm auch noch Doppelnamen einliest.
Nun die Frage, wie dies geht ?(
Ich bedanke mich schonmal im Vorraus.

Code:
//Dynamisches Einlesen von Namen mit String
// (c) by Tobias Kühn 09.05.2006

#include <iostream>
#include <string>
#include <cstdlib>

using namespace std;

void einlesen(string[],int);
void sortieren(string[],int);
void ausgabe(string[],int);

void main()
{
	string *name;
	int n;

	cout <<"\n\n\tWie viele Namen werden eingelesen?";
	cin >>n;

	name=new string[n];

	einlesen(name,n);
	sortieren(name,n);
	ausgabe(name,n);

	delete [] name;
}

void einlesen(string a[], int x)
{
	int i;

	for(i=0; i<x; i++)
	{
	cout <<"\n\n\tGebe den "<<i+1<<".ten Namen ein!";
	cin>>a[i];
	}

}

void sortieren(string a[],int x)
{
	int i,j;
	string merker;

	for (j=0; j<x; j++)
	{
		for(i=0; i<(x-1); i++)
		{
			if(a[i]>a[i+1])
			{
			merker=a[i];
			a[i]=a[i+1];
			a[i+1]=merker;
			}
		}
	}
}

void ausgabe(string a[], int x)
{
	int i;

	for (i=0; i<x ; i++)
	{
		cout <<"\n\n\tDer "<<i+1<<" Name ist: ";
		cout << a[i];
		cout <<endl;
	}
}
 
hab das listing jetzt nur mal kurz überflogen aber ich denke du hast das problem, das cin nur bis zum ersten leerzeichen zeichen einliest.

benutz statt cin einfach die funktion getline().
 
also entweder

cin.getline(const char *string,int length);

oder bei STL-string

getline(cin,string);


Sollte vielleicht gesagt werden damit es keine Komplikationen gibt
 
danke.

habe nun folgendes
Code:
void einlesen(string a[], int x)
{
	int i;

	for(i=0; i<x; i++)
	{
	cout <<"\n\n\tGebe den "<<i+1<<".ten Namen ein!";
	getline(cin, a[i]);
	}

}

doppelnamen werden nun eingelesen, aber bei der ausgabe ist das so:

ich gebe beispeilsweise 3 namen ein.

1. Name : lässt der Frei
2. Name : trägt der den ersten ein
3. Namen: trägt der den zweiten ein.

und der dritte name kommt nicht vor

das muss nur noch n klitzekleiner fehler sein ;)
wer findet ihn :)
 
hm ne damit gehts leider nicht. in kann damit die 3 namen eingeben, aber er gibts sie nicht aus und das programm bekommt ne fehlermeldung und wird geschlossen
 
@Ar-ras: Weißt du überhaupt, was du da sagst? o_O

@Tobse:
Erstmal ein paar kleinere Anmerkungen:
- der Standard erlaubt nur int als Rückgabewert von main - void main ist also nicht erlaubt.
- den header <cstdlib> scheinst du gar nicht zu brauchen - also besser gleich gar nicht einbinden.
- du kannst bei cout mehrere sachen direkt hintereinander ausgeben, musst also nicht immer eine neue Zeile anfangen. std::cout << "foo" << 123 << std::endl; ist durchaus erlaubt und in den meisten fällen einfach übersichtlicher.

Was das Problem mit der Ausgabe betrifft:
Nun, ich seh da jetzt auf Anhieb keinen Fehler. Allerdings bin ich mir bei deiner Sortierfunktion nicht ganz sicher, ob die so korrekt ist, das müsste ich mir notfalls nochmal genauer ansehen. Das könntest du aber leicht prüfen, indem du noch zusätzlich den header <algorithm> einbindest und dann in der Funktion 'main' den Aufruf von 'sortieren' durch folgendes ersetzt:
Code:
sort(name, name + n);
(Ungetestet, sollte aber stimmen.)

Wenn dann immernoch der gleiche Fehler auftritt, dann liegt es an einer anderen Stelle. Um die zu finden solltest du am besten mal dein Programm mit einem Debugger Schritt für Schritt durchgehen.
 
Die einzigen Array-Fehler hast du produziert.

Wenn die erste eingabe übersprungen wird, dann liegt das daran, dass vermutlich noch ein Return-Zeichen oder ähnliches im Stream steht (std::getline ist da sicher nicht das Problem). Dies müsste man also erstmal entfernen. Folgendes sollte dazu eigentlich reichen (ungestest):
Code:
cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
(Die Headerdatei <limits> muss dafür aber noch eingebunden werden.)



macht er nicht std:: weil er nicht namespace std schreibt?
Erklär mir mal, was du mit dem Satz sagen willst.
 
Original von Ar-ras
Tja hattest recht mit dem Returnzeichen(ich musste aber <limits> nicht einbinden)
Liegt vermutlich daran, dass die Headerdatei von einer einer anderen bereits eingebunden wurde. Sauberer wäre es aber, wenn man sie zusätzlich noch einbindet - es hat ja keine negativen Folgen, wenns dadurch zweimal drin wäre.
Original von Ar-ras
Erklär mir mal, was du mit dem Satz sagen willst.
Das war ne Frage nebenbei... Ob man nicht das std:: weglassen könnte, wenn man einfach
Code:
using namespace std;
hinschreiben würde
Steht ja aber hier
Ja, kann man - mache ich aber prinzipiell nie, weil das das Konzept der namespaces ad absurdum führt...
 
Zurück
Oben