Groesse von Strings erfahren



  • Hallo liebe Community,
    meine Frage lautet: Gibt es eine "ftell" Funktion auch für Strings?
    Denn ich habe folgendes Anliegen ich möchte etwas in einen String von der Tastatur reinschreiben.
    Also wie folgt:

    #include <stdio.h>
    
    int main()
    {
      char szEin[255]; //Eingabe String
    
      printf ("Text eingeben:\n");
      fgets (szeingabe, 255, stdin);
    
      printf ("Der Text lautet:\n%s", szEin);
    
      return 0;
    }
    

    Ich möchte jetzt die Größe des Strings abfragen, ähnlich wie bei der "fseek" und "ftell" Funktion von Dateien.
    Ich stelle mir das ungefähr schlussendlich so vor:

    #include <stdio.h>
    
    int main()
    {
      char szEin[255]; //Eingabe String
      int iP;  //Hier soll die Postion des Stringes stehen
    
      printf ("Text eingeben:\n");
      fgets (szeingabe, 255, stdin);
    
      printf ("Der Text lautet:\n%s", szEin);
    
      /*Hier kommt meine "Vorstellung des Codes"*/
    
      fseek(szEin, 0, SEEK_END);
      iP = ftell(szEin);
    
      return 0;
    }
    

    Ich hoffe ihr könnt mir sagen ob es so eine Funktion oder so ähnliche für mein Problem gibt.
    Ich bedanke mich im Voraus und wünsche euch noch ein schönes Wochenende 🙂



  • strlen



  • Ergänzung für extrem-faule Google-Ablehner:
    www.cplusplus.com/reference/cstring/strlen/

    Habe öfters vergessen bei der Erzeugung durch nen char-Puffer das '\0' anzuhängen *hehe*



  • Ok, vielen Dank euch beiden, habe das bereits total vergessen hehe 😃

    Aber ich habe nun ein neues Problem, wie geht es den mit unsigned char Elementen?



  • Von genauso bis gar nicht ist hier alles möglich. Wo kommen die unsigned chars denn her? Zeig möglichst Code.



  • FKognito schrieb:

    Aber ich habe nun ein neues Problem, wie geht es den mit unsigned char Elementen?

    unsigned char und signed char sind zum rechnen (mit kleinem Wertebereich).
    char ist für Zeichen da. Bei Arrays dann noch nullterminiert.

    DArum bleibt die Frage, wie du an das unsigned char kommst.



  • Es ist ein Schulprojekt, dort wurde unsigned char vorgegeben also ist der Code der Selbe nur mit unsigned char. 😕



  • FILE* stellt einen Stream dar, char[] ist statisch, d.h. beide Dinge sind prinzipiell NICHT miteinander vergleichbar.
    Du solltest klar definieren: was meinst du mit "Größe bestimmen"


  • Mod

    FKognito schrieb:

    Es ist ein Schulprojekt, dort wurde unsigned char vorgegeben also ist der Code der Selbe nur mit unsigned char. 😕

    Worauf die anderen hinaus wollen: Es ist in diesem Zusammenhang nicht klar, was genau man unter der "Größe" eines solchen Objekts versteht. In C werden Zeichenketten per Konvention durch ein Nullzeichen beendet. Da könnte man die Anzahl der Zeichen vor dem Nullzeichen als "Größe" (eher: "Länge") auffassen. Dafür ist strlen da (welches in der einfachsten Implementierung einfach so lange die Zeichenkette durchgeht, bis es ein Nullzeichen findet und dabei mitzählt). Aber wie auch schon gesagt wurde, wird für Zeichen der Datentyp char (oder wchar_t) benutzt, unsigned char und signed char sind hingegen eher als kleine Verwandte eines ints anzusehen und sind nicht primär für Zeichenverarbeitung gedacht, sondern zum Rechnen mit Zahlenwerten.
    Bei Zahlendaten geht das natürlich nicht mehr mit der Konvention, das Ende der Daten durch eine Null zu markieren. Denn sonst wäre es ja unmöglich, dass eine der Zahlen den Wert 0 hat (Bei Zeichenketten geht das, weil man dem Nullzeichen die Sonderbedeutung zugeordnet hat, dass es eben zu nichts sonst gut ist, außer das Ende zu markieren). Das heißt, man muss das irgendwie anders machen. Daher ist es wichtig, wo die Daten her kommen.
    Wenn die Daten in einem Feld stehen, dann ist es üblich, mit anzugeben, wie viele Datenelemente in dem Feld stehen (oder einen Zeiger hinter das letzte Element des Feldes anzugeben, was auf das gleiche hinaus läuft). Du müsstest also irgendwoher noch diese Zusatzinformation bekommen haben.
    Oder ihr habt euch auf eine andere Konvention geeinigt, weil zum Beisiel die 0 doch nicht vorkommen kann und daher doch zur Markierung des Endes genommen werden kann. Dann kannst du wieder analog zu strlen vorgehen.
    Oder die Daten sind in einem Array (Das richtige Array, kein Zeiger auf das erste Element!) verfügbar und die Konvention ist, dass das Array eben komplett gefüllt ist. Dann ist die Anzahl der Daten die Größe des Arrays geteilt durch die Größe eines Elements (sizeof).

    Du siehst, es ist nicht so klar, was mit "Größe" gemeint ist. Wir brauchen mehr Details.



  • Tut mir leid wenn ich mich nicht ganz klar ausgedrückt habe.

    Also schildere ich nun die folgende Situation genau:
    Unser Projekt handelt um das Verschlüsseln (hierbei habe ich aber keine Probleme).
    Eine der Aufgaben dazu sieht so aus:
    - Einlesen eines Textes von der Tastatur
    - Den Text verschlüsseln
    - Speichern in Datei
    Die ASCII-Zeichen sollen als "unsinged char" gespeichert werden!

    Nachdem ich euch jetzt die Aufgabe geschildert habe, möchte euch nun mein Problem genauer erläutern:
    Um diese Länge/Größe von dem Text zu erfahren, der in dem "unsinged char" gespeichert ist, brauche ich eure Hilfe.
    Ich hatte das so geplant:
    1. Länge des Textes im "unsigned char" erfahren
    2. Diese Länge in eine "integer Variable" reinschreiben
    3. Anschließend die Verschlüsselung mit einer "for-Schleife"

    Ich hoffe ich habe nichts vergessen und diese Information reichen.
    Vielen Dank im Voraus an alle die Helfen können und schönes Wochenende euch noch 🙂


  • Mod

    Wie kommt denn der Text in dein unsigned char Feld?



  • Das weiß ich auch nicht 😕
    Das unsigned char macht es mir grade so schwer


  • Mod

    FKognito schrieb:

    Das weiß ich auch nicht 😕

    Dann ist hier das wahre Problem. Um es zu loesen: Wo soll der Text her kommen? Mit dieser Information kann man sich eine passende Methode ueberlegen, bei der gewiss auch die Laenge abfaellt.



  • Wie bereits gesagt soll der Text von der Tastatur eingelesen werden und anschließend in einen unsigned char gespeichert werden.



  • Eine Möglichkeit:
    Einlesen in ein char-Array, Länge mit strlen bestimmen, mit memcpy in den unsigned char Speicher kopieren.



  • DirkB schrieb:

    Eine Möglichkeit:
    Einlesen in ein char-Array, Länge mit strlen bestimmen, mit memcpy in den unsigned char Speicher kopieren.

    Warum so umständlich? Da reicht doch ein Array, wenn man gleich in das unsigned-char-Array einliest.


Log in to reply