• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

Perl-Funktionen in C nachbauen [Beendet]

Naja, bevor Du so große Sprünge machst ;) solltest Du Dich noch mal etwas mit C beschäftigen...

schauen wir doch mal in Deine chomp-Variante rein ;)

Code:
if (strstr(str,"\n")==0) {return (str);}

wendet Deine Schleife auch auf folgende Zeichenkette an:
Code:
Hallo\nWelt
obwohl da nix nötig ist ;) hier ist strstr etwas mit Kanonen auf Spatzen geschossen.

was macht chomp: wenn am Stringende ein '\n' steht, dann entferne es, warum schreibst Du das dann nicht?

Code:
char *chomp(char *string) {
	if (string[strlen(string)-1] == '\n')
		string[strlen(string)-1] = '\0';
	return string;
}

dann sowas hier:
Code:
c=(char *) malloc(200);
solltest Du Dir bzgl. wartbarkeit ganz schnell abgewöhnen ;)

besser so:
Code:
  char *c=(char*)malloc(sizeof(char) * LÄNGE);


daher mal als kurzes Beispiel:



Code:
#include <stdio.h>


char *chomp(char *string) {
	if (string[strlen(string)-1] == '\n')
		string[strlen(string)-1] = '\0';
	return string;
}

void sc(char *dest, const char *source) {
  while ( (*dest++ = *source++ ) != '\0') ;
}

void main() {
  char *conststr = "Hallo Welt\n";

  // DEMO-HACK dynamisch machen... da conststr nicht manipuliert werden kann...
  char *s=(char*)malloc(sizeof(char) * strlen(conststr));
  sc(s, conststr);
  // END DEMO-HACK

  printf( "String s vor chomp:\n<VOR>%s<NACH>\n", s);
  chomp(s);
  printf( "String s nach chomp:\n<VOR>%s<NACH>\n", s);
}


Analog bei Deinem Substr:

Code:
c=(char *) malloc(200);
hey, warum die Speicherverschwendung? Du kennst doch die genaue Länge des Zielstrings :)
zudem kann perl substr noch etwas mehr ;)



Nachtrag: gewöhn Dir Einrückungen an ;)
 
schon gemacht -> libHX
arbtrees, die man wie %hashes und automatisch-sortierende Listen funktionieren; deques für alles, was einfacher als ein %hash sein kann; und ein Haufen voller Stringfunktionen, von denen ich mindestens 50% nicht mal oft brauche.
 
abgdf schrieb:
Was meinst Du: Soll man hier nur posten, wenn man perfekten Code schreibt, insbesondere weil man ausgebildeter Informatiker ist oder schon dann, wenn man einfach Spaß daran hat, daß überhaupt mal irgendwas funzt ?

ich kann sowas gerne auch unkommentiert stehen lassen... aber Dein Ansatz war

Ich habe hier schonmal zwei gebaut (Nachbildungen von "chomp" und "substr"):

und das hast Du halt in meinen Augen noch nicht ... mein Hinweis ging ja primär in die Richtung, dass Du dich noch etwas mehr mit der gewünschten Sprache auseinandersetzen sollst, damit bessere Resultate rauskommen. Ob Deine Funktionen das richtige tun, hab ich nicht genau analysiert, dafür fehlt mir die Zeit, d.h. ich sage nur etwas zu dem was mir sofort auffällt... (sicher ist nur, dass eine lange Textzeile mit Deinen malloc(200) auf die Nase fällt...)

und dann steckt da noch mehr drin ;) Algorithmen entwerfen ist nicht ganz tirvial, siehe das chomp Beispiel: einfach irgendwie wild mit Schleifen hantieren muss ja nicht sein, überleg Dir vorher genau, was die Funktion tun muss und dann, wie Du es realisierst. Das ist bei den beiden Funktionen ein Unterschied von O(n) zu O(1) und das ist erheblich...

(OK, OK; durch strlen wird es auch O(n), aber das liegt jetzt an der String-Realisierung durch char* mit \0, mit einer anderen Realisierung z.B. mit

Code:
struct {
  char* value;
  int length;
}
bin ich dann schon wieder bei O(1)... )
 
Moin abgdf,

ich glaube da tust Du den beiden Unrecht. TeXpert hat dir doch recht ausführlich gezeigt wo deine gedanklichen Fehlansätze sind, das ist mehr als Du in einem reinen Programmierforum bekommen würdest. Und jengelh hat dir zusätzlich einen Hinweis gegeben wo Du deinen Code mit seinem vergleichen kannst und dadurch evtl. Fehler in deinem entdecken kannst. Eigentlich doch sehr nett, wenn auch von dir wohl mißverstanden.
 
abgdf schrieb:
Wenn ich doch nur Genörgel von den Profis zu hören krieg, und es alles sowieso schon gibt, dann laß ich's halt.

ich glaube Du bist etwas zu empfindlich, Programmieren lernt man nur, indem man es tut und sich von anderen sagen lässt, was an dem eigenen Code nicht so toll ist.

So, Dein ersten Post hab *ich* so gelesen, dass Du von Dir denkst, C zu können und jetzt Perl-Funktionen abzubilden... und unter diesem Gesichtspunkt stimmte das Ergebnis nicht.


wenn ich mir meinen 1. Post noch mal ansehe, dann kann es eigendlich nur

Naja, bevor Du so große Sprünge machst Wink solltest Du Dich noch mal etwas mit C beschäftigen...

gewesen sein, dass Dich wieder in die Dunkelheit getrieben hat.... hey, bei einem Kommentar wieder flüchten? denk mal drüber nach....
 
Oben