String einlesen

  • String einlesen

    Hallo,

    zZ. programmiere ich in C und ich hab mich gefragt was denn wohl die beste Methode ist einen String einzulesen bzw. einen String einzulesen, der dynamisch in seiner Länge ist. Mir fallen jetzt ganz spontan drei Möglichkeiten ein, ich frage mich aber ob ihr nicht vielleicht eine bessere Methode kennt. Bin noch relativ unerfahren. Also Methode 1 und 2 gehen über die Funktionen scanf(), fgets(). Das Problem bei scanf ist dass es scheinbar immer nur das erste Wort eines Satzes einliest. Dasselbe Problem wird bei fgets() gelöst, nur ist der String immer noch ziemlich statisch bzw. ich muss halt immer ein chararray davor mit fester Länge definieren. Die dritte Methode kann ich mir nur denken, nur frag ich mich ob die wirklich sozusagen "effizient" ist. Stichwort verkettete Listen. Aber ist das wirklich gut ?

    Habt ihr nicht vielleicht ein paar Tipps.

    P.S.: übrigens ich bin jetzt von Visual C++ auf GTK umgestiegen ^^
  • hallo koljan,

    solche wie ich ? oO ich glaub du solltest dein urteil nochmal ein bisschen zurückstecken, hört sich aufjedenfall net so doll an :(

    dachte auch vielmehr man könnte hier auf gleichgesinnte treffen, die einen nicht gleich immer auf google verweisen und die typische antwort aka "machs doch selbst du idiot" raushaun. tschuldigung für den wortgebrauch lieber herr admin.

    und ich denke spätestens jetzt hat sowieso keiner mehr bock hier zu antworten. denke ich geh dann mal weg von euch. schönen tag noch forum...
  • genau das meinte ich, solche wie Du :)

    Jetzt mal OffTopic, war mal als Praktikant bei einer Versicherung beschäftigt, da haben manche echt es gebracht zu sagen "soll ich etwa zu anderer Versicherung gehen, wenn dies und das nicht so ist?" da brennt mir immer die Sicherung durch und ich sage "joa, machen sie mal, schönen Tag noch :whistling: "

    Einen Ansatz habe ich Dir geliefert, denn ich sitze schon seit ner geraumen Zeit ohne C zu benutzen und erinnere mich nicht mehr ob ich sowas wie unendliche Strings jemals gebraucht habe :) In C++ gab es die Klasse String, die man benutzen könnte. Meine Idee war es für C entweder eine Klasse zu benutzen oder eine Klasse selbst zu basteln.

    Tut mir Leid wenn ich nicht nett gewesen bin und es tut mir auch Leid an d0nut :D bin ein schlechter Forummitglied ;( Verscheuche hier Mitglieder. aber was solls ^^
  • Also scanf (und Verwandte) überlesene führende Whitespaces, hören aber dann nachdem ersten Whitespace auf, die Befehle sind also nicht geeignet für das, was du suchst.
    gets (und Verwandte) hören erst nach einem Newline auf, also schon eher das was du suchst. Die Länge ist durchaus dynamisch du musst aber ja vorher Speicher allokieren (malloc & co), du damit bist du in jedemfall gezwungen eine Größenabschätzung zu machen. Das N gibst du an damit nicht über den Speicher hinausgeschrieben wird, und damit fremder Speicher überschrieben wird. Das Problem lässt sich auch kaum lösen, da C eigentlich überhaupt kein Stringkonzept hat, fgets ist auf jedenfall das Mittel der Wahl. Entweder du allokierst einen sehr großen Bereich und kopierst es auf einen passenden Bereich um, oder du musst alles selber machen.

    Wenn du alles selber machen möchtest, musst du jeden Tasteneingabe (z.B. mit getc) auslesen, in einen allozierten Speicher schreiben, und diesen dann um einen vergrößern (reallozieren, bzw eine verkettete Liste). Solange bis Enter oder so gedrückt wird. Dann würde der Speicherbereich dynamisch mitwachsen. Aus Performancegründen, ist das aber nicht bei Dateieinlesen sondern eher bei Keyboardeingaben zu empfehlen. Außerdem hast du bei verketteten Listen das Problem, dass du für einen Byte Nutzdaten (das Character), einen 4Byte Pointer benötigst. Verkettet Listen haben natürlich den Vorteil dass der kram im Speicher verteilt sein darf, bei alloc wird immer zusammenhängender Speicher benötigt, sodass realloc unter Umständen umkopieren muss, was bei großen Datenmengen auch inperformant werden dürfte.

    P.S. Foren sind kein Echtzeitkommunikationssystem.
    ~ mfg SeBa

    Ich beantworte keine PMs zu Computer-/Programmierproblemen. Bitte wendet euch an das entsprechende Forum.

  • hm...ja. das war genau die antwort die ich mir erhofft hatte. ich sehe nun dass es nicht sehr effizient ist pro zeichen einen pointer anzulegen der auf das nächste zeichen zeigt. das kostet natürlich speicherplatz. andererseits würde jedesmal ein array zu deklarieren, dass ca 50000 indizes hat auch beträchtlich ins gewicht fallen. zu der geschwindigkeit bzw. ausführungszeit kann ich leider nichts sagen, da ich nicht weiss ob der zugriff auf ein array, angefangen von 0 bis n (chronologische abarbeitung der zeichen) oder ob sich das durchhangeln durch eine verkettete liste als schneller erweist. aber ich glaube von den verketteten liste lass ich erstmal ab. wenn ich mir dass so hochrechne, also nur den platzverbrauch der pointer pro zeichen, dann würde ich bei sagen wir mal 1000 zeichen ungefähr auf 4000byte kommen. hm...schwierig, aber das ist bestimmt nicht effektiv. und wenn ich einen ganzen aufsatz mit ca 100000 zeichen einlesen will (denn sowas in der art hab ich vor), dann ergäbe sich ein speicherverbrauch von ~ 400000byte. das ist eindeutig zuviel.

    edit: eine frage. hat c++ da eine bessere lösung zu. also strings dynamisch in der länge einlesen ?

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Qualmi ()