Strings vergleichen und sortieren

Challenge accepted.

Meinst du so etwas?
C++:
#include <stdio.h>
#include <stdlib.h>
#include <string>
#include <string.h>

int strnatcmp(char* s1, char* s2)
{
	int i = 0;
	while(s1[i] != '\0')
	{
		while(s1[i] == s2[i])
		{
			if(s1[i] == '\0' && s2[i] == '\0') return 0;
			else if(s1[i] == '\0') return 2;
			else if(s2[i] == '\0') return 1;
			i++;
		}
		if(isdigit(s1[i]) || isdigit(s2[i]))
		{
			char n1[10];
			char n2[10];
			int ii = i;
			int i3 = 0;
			int ni1 = 0;
			int ni2 = 0;
			if(isdigit(s1[i]))
			{	
				while(isdigit(s1[ii]))
				{
					n1[i3] = s1[ii];
					ii++;
					i3++;
				}
				n1[i3] = '\0';
				ni1 = atoi(n1);
			}
			ii = i;
			i3 = 0;
			if(isdigit(s2[i]))
			{	
				while(isdigit(s2[ii]))
				{
					n2[i3] = s2[ii];
					ii++;
					i3++;
				}
				n2[i3] = '\0';
				ni2 = atoi(n2);
			}
			if(ni1 > ni2) return 1;
			else return 2;
		}
		else
		{
			if(s1[i] > s2[i]) return 1;
			else return 2;
		}
		i++;
	}
}

int main(int argc, char* argv[])
{
	char s1[512] = {"aaa 123 aaa"};
	char s2[512] = {"aaa 99 aaa"};
	
	if(strnatcmp(s1,s2) == 1) printf("1 ist groesser\n");
	else if(strnatcmp(s1,s2) == 2) printf("2 ist groesser\n");
	else printf("Beide sind gleich gross\n");
	
	
	system("PAUSE");
	return 0;
}

Leider ohne wstring / Gross/Kleinschreibung ;-)
Zudem fehlt der praktische Nutzen eines Vektors, dafür kommt es eher an strnatcmp() heran.

Gruss
cwriter
 
Zuletzt bearbeitet:
Zudem fehlt der praktische Nutzen eines Vektors
Warum nicht gleich so?

Diese Funktion kannst du jetzt mittels eines Wrappers für std::sort verwenden.

Üblicherweise gibt man einen neg. Wert zurück wenn Argument 1 kleiner als 2 war, 0 wenn gleich, pos. falls größer.

Du verbrauchst zuviel LOC.
Klasse, kurz und übersichtlich, ich mag deinen Stil.
Warum benutzt du denn nicht einfach die Funktionen aus dem natsort Projekt anstatt das halb nachprogrammierte von cwriter?

Gruß
 
Ich halte mich jetzt mal zurück und verweise ganz schlicht auf "konstruktive Kritik".
Warum benutzt du denn nicht einfach die Funktionen aus dem natsort Projekt anstatt das halb nachprogrammierte von cwriter?
1. Mein Code ist lizenzfrei (je nach Endprodukt besser)
2. Ich habe nichts nachprogrammiert. Den natsort-Code habe ich mir nicht angeschaut.
3. Ich zwinge niemanden, den Code zu verwenden

Du verbrauchst zuviel LOC.
Da ich nicht weiss, was genau LOC ist, vermute ich einfach mal, dass Speicher oder Leistung gemeint ist. Ich kann aber auf ein Zitat von mir verweisen:
ich habe eine "einzigartige" Art zu programmieren
Dies beinhaltet meinem nicht-speicher- & leistungsoptimierten Programmierstil.
Warum nicht gleich so?

Diese Funktion kannst du jetzt mittels eines Wrappers für std::sort verwenden.
Ich kann das nicht, da ich mich nicht sehr mit den C++ Funktionen auskenne und das Resultat dementsprechend wohl auch nicht deinen Ansprüchen genügt.

cwriter
 
1. Mein Code ist lizenzfrei (je nach Endprodukt besser)
Lizenzfrei heißt das man nicht weiß ob man den Code verwenden darf oder nicht. Besser wenn man weiß woran man ist. Das natsort Projekt steht unter der zlib Lizenz.
2. Ich habe nichts nachprogrammiert. Den natsort-Code habe ich mir nicht angeschaut.
Du hast eine Funktion geschrieben, welche die gleiche Funktionalität hat wie die strnatcmp Funktion vom natsort Projekt. Also hast du es nachprogrammiert - völlig egal ob du den Code angsehen hast.
Da ich nicht weiss, was genau LOC ist
eine kurze Suche nach "loc" und du weißt was gemeint ist. ;-]

Gruß
 
eine kurze Suche nach "loc" und du weißt was gemeint ist
Ja. Weshalb genau es schlechter sein soll, mehr Zeilen zu nutzen, ist mir aber schleierhaft, zumal zumindest ich den Code besser lesen kann, wenn nicht alles auf eine Zeile presse.
Also hast du es nachprogrammiert - völlig egal ob du den Code angsehen hast
In diesem Aspekt stimmt das. Dann müsste man aber vieles als nachprogrammiert betrachten, z.B. auch cout(), da es ja dasselbe macht wie printf().
Lizenzfrei heißt das man nicht weiß ob man den Code verwenden darf oder nicht. Besser wenn man weiß woran man ist
:heul: Dann mache ich diese Lizenz: Frei (kommerziell) nutzbar, ohne Credits zu vergeben.
Zumindest kenne ich keine existierende Lizenz, die etwas frei zugänglich macht.
Man kann auch wirklich alles verkomplizieren...

Mit freundlichen Grüssen
cwriter
 
Hallo,

hier noch eine andere Möglichkeit nur mit STL (c++ in Visual Studio 2010):
Quelle: http://stackoverflow.com/questions/4611302/sorting-utf-8-strings

... mit Boost geht das sicherlich noch einfacher.

//EDIT: Ich glaube deine Sortierung wird von diesem Verfahren nicht unterstützt...

C++:
#include <string>
#include <vector>
#include <algorithm>
#include <locale>
#include <iostream>
#include <functional>

using namespace std;

class collate_in : public binary_function<string, string, bool> 
{
  protected:
	const collate<char> &coll;
  
  public:
	collate_in(locale& loc) : coll(use_facet<collate<char> >(loc)) {}
    
	bool operator()(const string& a, const string& b) const 
	{
	   return coll.compare(a.c_str(), a.c_str() + a.size(),b.c_str(), b.c_str() + b.size()) < 0;
	}
};

int main(int argc, char* argv[])
{

	vector<string> strings;
	
	strings.push_back("jkl");
	strings.push_back("001abc");
	strings.push_back("ghi");
	strings.push_back("000def");
	strings.push_back("m");
	strings.push_back("12 A");
	strings.push_back("11 A");

	locale loc("German");

	sort(strings.begin(),strings.end(),collate_in(loc));

	for(int i = 0; i < strings.size(); i++){
       cout << strings[i] << endl;    
    }
	
	return 0;
}

Ausgabe:
Code:
000def
001abc
11 A
12 A
ghi
jkl
m


Gruß Tom
 
Ja. Weshalb genau es schlechter sein soll, mehr Zeilen zu nutzen, ist mir aber schleierhaft, zumal zumindest ich den Code besser lesen kann, wenn nicht alles auf eine Zeile presse.
Du hast da was missverstanden. Es geht nicht darum alles auf eine Zeile zu schreiben. Dein Ausdruck ist schlecht, du verkomplizierst die Dinge zu sehr, man kann es kompakter ausdrücken.
In diesem Aspekt stimmt das. Dann müsste man aber vieles als nachprogrammiert betrachten, z.B. auch cout(), da es ja dasselbe macht wie printf().
Der Vergleich hinkt. cout und printf sind zwei völlig verschiedene Ansätze.
:heul: Dann mache ich diese Lizenz: Frei (kommerziell) nutzbar, ohne Credits zu vergeben.
Du machst die Lizenz frei? Du meinst den Code? Was denn nun?
Zumindest kenne ich keine existierende Lizenz, die etwas frei zugänglich macht.
Man kann auch wirklich alles verkomplizieren...
Laut Berner Konvention hält der Autor automatisch ein exklusives Copyright an geschriebenen Programmen. Man muss es ausdrücklich ablehnen falls man es in die "public domain" freigeben will. Das hast du nicht getan.

Gruß
 
Ich lehne sämtliche Copyrights auf den Code, den ich hier poste, ab und gebe ihn frei.

cwriter
 
Hui Leute, nur kein Streit wegen mir. :eek:

Um meine Zwecke mal klarzustellen:

Mein Hauptzweck ist lernen, ohne praktische Anwendung, und wenn doch mal ein praktischer Nutzen bei meinem Lern-Projekt rauskommt, dann nur für mich selber.
Ich bin noch viel mehr Anfänger als cwriter, aber ich liebe es zu verstehen, was hinter dem Code steckt, darum ist mir "nachprogrammiert" allemal lieber als eine fertige Library wo ich ausser der Syntax für den Funktionsaufruf nichts verstehe.

Klar, irgendwann muss ich auch mal "vernünftigen" Code schreiben, aber bis dahin gibt es vermutlich Windows18 und C++++, sprich darum mache ich mir im Moment noch keinen Kopf.
 

Neue Beiträge

Zurück