Zum Inhalt springen

Teilstring aus einem String extrahieren


Eleu

Empfohlene Beiträge

Hallo Ihr lieben C-Programmierer,

ich suche eine "dll", die mir einen Teilstring aus einem String extrahiert und zurückliefert.

Also der "dll" werden 2 Zahlen übergeben und der String.

Beispiel:

In - Parameter String (Datentyp: char): "Ich bin der String"

In - Parameter wie viele Zeichen am Anfang abschneiden (Datentyp Int): 3

In - Parameter wie viele Zeichen vom Ende abschneiden (Datentyp Int): 4

Out - Parameter (Datentyp: char): " bin der S"

Mein Skript Editor unterstützt nur ANSI-C-Funktionen.

Und die <stdio.h> kann ich leider nicht einbinden.

Mit den Funktionen str_trunc(string1,zahl); und

str_clip(string1,zahl); der <stdio.h> müsste es gehen.

Str_trunc schneidet so viele Zeichen vom ENDE des Strings ab, wie in Zahl angegeben wurde.

Str_clip funktioniert genauso wie str_trunc nur das Str_clip die Zeichen vom ANFANG des Strings abschneidet.

Kann mir jemand eine solche "dll" liefern.

Eine solche "dll" könnte ich dann mit <pragma code> in meinem Skript mit einbinden und nutzen.

Gruß

Eleu

Link zu diesem Kommentar
Auf anderen Seiten teilen

ich suche eine "dll", die mir einen Teilstring aus einem String extrahiert und zurückliefert.

Also der "dll" werden 2 Zahlen übergeben und der String.

Einer Bibliothek kannst du nichts übergeben, und sie kann auch nichts zurückgeben. Das geht mit Funktionen. Du kannst allerdings Funktionen in eine Bibliothek stecken.

Mein Skript Editor unterstützt nur ANSI-C-Funktionen.
Der Editor hat damit eigentlich nichts zu tun. Entscheidend ist, was der Compiler kann.

In - Parameter String (Datentyp: char): "Ich bin der String"

...Out - Parameter (Datentyp: char): " bin der S"

Datentyp char bedeutet ein einzelnes Zeichen. Strings sind Arrays von char. Und hier fangen die Probleme an. Arrays sind schlechte Funktionsparameter (sie zerfallen zu Zeigern) und noch schlechtere Rückgabewerte (geht gar nicht).

Mit den Funktionen str_trunc(string1,zahl); und

str_clip(string1,zahl); der <stdio.h> müsste es gehen.

Das sind keine ANSI-C-Funktionen.

Kann mir jemand eine solche "dll" liefern.
Ohne dass du mehr über das System erzählst und den Compiler stellst oder zumindest nennst, falls er frei verfügbar ist, nein. C ist auf Quellcodeebene plattformunabhängig, nicht auf Ebene der erzeugten ausführbaren Dateien.

Soll das eine Auftragsarbeit werden?

Eine solche "dll" könnte ich dann mit <pragma code> in meinem Skript mit einbinden und nutzen.
Mag sein, Pragmas sind compilerimplementationsspezifisch.
Link zu diesem Kommentar
Auf anderen Seiten teilen

5sec gesucht..

substr - C++ Reference

Ich lese mit der Funktion "fgets" eine Zeile aus einer Textdatei aus.

In der jeweiligen Zeile der Textdatei steht immer was anderes.

Was da dann drinsteht, weiß man nicht.

Man weiß nur, dass die Information die extrahiert werden soll

nach den ersten 6 Zeichen in der Zeile beginnt.

Die nächste Information dann nach 30 Zeichen usw...

In Deinem Beispiel ist der aber Teilstring bekannt.

Trotzdem Danke für den Tipp.

Einer Bibliothek kannst du nichts übergeben, und sie kann auch nichts zurückgeben. Das geht mit Funktionen. Du kannst allerdings Funktionen in eine Bibliothek stecken.

O.k. aber die von mir gesuchte Funktion könntest Du mir doch in Form einer Bibliothek (dll) zur Verfügung stellen, eben weil ja str_trunc(string1,zahl); und

str_clip(string1,zahl); keine Ansi C Funktionen sind.

Datentyp char bedeutet ein einzelnes Zeichen. Strings sind Arrays von char. Und hier fangen die Probleme an. Arrays sind schlechte Funktionsparameter (sie zerfallen zu Zeigern) und noch schlechtere Rückgabewerte (geht gar nicht).

O.k. ist es vielleicht möglich, in Ansi - C den Datentyp char in einen Datentyp zu konvertieren, der wiederum von der Funktion aus der gewünschten library verarbeitet werden kann ?

Allerdings muss ich das Ergebnis der Funktion hinterher wieder in char umwandeln.

Ohne dass du mehr über das System erzählst und den Compiler stellst oder zumindest nennst, falls er frei verfügbar ist, nein. C ist auf Quellcodeebene plattformunabhängig, nicht auf Ebene der erzeugten ausführbaren Dateien.

Soll das eine Auftragsarbeit werden?

Es handelt sich um ein Scada System (WinCC)

Win CC hat als Standard Ansi C.

Das Einbinden von selbst erstellten dll`s ist laut Handbuch möglich.

Beispiel für den Zugriff auf die API des Betriebssystems:

#pragma code("kernel32.dll")

VOID GetLocalTime(LPSYSTEMTIME lpSystemTime);

#pragma code()

SYSTEMTIME st;

GetSystemTime(&st);

Wenn es nicht geht, habe ich Pech gehabt.

Aber ich finde man könnte es mal mit einer "dll" probieren.

Man könnte auch die Headerdatei <stdio.h> in WinCC einbinden.

Wenn ich aber versuche die im Internet verfügbaren Header von stdio.h in WinCC

einzubauen meckert aber der Compiler von WinCC.

Vielleicht kann mir jemand den richtigen Header file

<stdio.h> für WinCC zur Verfügung stellen ?

Nein, es ist keine Auftragsarbeit.

Wieso schreibst Du sowas nicht gleich selbst?

Ist doch kein Aufwand ...

Für Dich sicherlich nicht, aber ich habe das noch nie gemacht

und ich bin in C noch nicht so Fit.

Auch habe ich keinen Skript Editor der mir einen solchen Compiler

bei der Installation mitliefert, um die von mir genannten Funktionen zu verwenden <stdio.h>

Für das Erstellen einer solchen "dll" brauchst Du vielleicht 10 min.

Bis ich mich da eingearbeitet habe, dauert es eine Ewigkeit.

Gruß

Eleu

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich lese mit der Funktion "fgets" eine Zeile aus einer Textdatei aus.
fgets kommt normalerweise aus <stdio.h>.

O.k. aber die von mir gesuchte Funktion könntest Du mir doch in Form einer Bibliothek (dll) zur Verfügung stellen, eben weil ja str_trunc(string1,zahl); und

str_clip(string1,zahl); keine Ansi C Funktionen sind.

Warum versteifst du dich denn so auf eine DLL? Wenn du da so frei in C programmieren kannst, dass du fgets benutzen kannst, brauchst du weder eine Funktion noch eine DLL, das kannst du doch einfach so in deinen Code schreiben. Angenommen, zeile sei das char-Array, in das du mit fgets einliest, und du willst ab dem 7. Zeichen 10 Zeichen rauslesen:

char* substr = &zeile[6];
zeile[16] = '\0';[/code]

Dann zeigt substr auf den Teilstring, den du extrahieren willst. Allgemein setzt du einen Zeiger auf den Anfang des Teilstrings, und ersetzt das Zeichen dahinter durch ein Nullbyte, wodurch das Stringende markiert wird.

Der Zeiger ist aber nur solange gültig, wie das Array zeile existiert. Wenn du den Inhalt länger brauchst, musst du ihn kopieren.

O.k. ist es vielleicht möglich, in Ansi - C den Datentyp char in einen Datentyp zu konvertieren, der wiederum von der Funktion aus der gewünschten library verarbeitet werden kann ?
Char kann von Bibliotheken verarbeitet werden, das ist nicht das Problem. Das Problem ist, dass in char kein String reinpasst. Auch fgets arbeitet nicht mit char, sondern mit char-[b]Zeigern[/b], die auf hinreichend große Arrays verweisen müssen.

Allerdings muss ich das Ergebnis der Funktion hinterher wieder in char umwandeln.
Nein. Nicht char. Char ist [b]ein einzelnes Zeichen[/b].

Aber ich finde man könnte es mal mit einer "dll" probieren.

Wie gesagt, ich halte das für unnötig umständlich. Was du willst, kann man im einfachsten Fall mit zwei Zeilen Code lösen.

Man könnte auch die Headerdatei <stdio.h> in WinCC einbinden.

Wenn ich aber versuche die im Internet verfügbaren Header von stdio.h in WinCC

einzubauen meckert aber der Compiler von WinCC.

Vielleicht kann mir jemand den richtigen Header file

<stdio.h> für WinCC zur Verfügung stellen ?

Wenn du fgets verwenden kannst, hast du den vermutlich schon. Irgendwelche Header irgendwoher zu kopieren, klappt übrigens praktisch nie. Du musst schon die Header benutzen, die zu deinem Compiler gehören. Und die sollten immer dabei sein.

Übrigens: "Der Compiler meckert" ist nie eine ausreichende Problembeschreibung.

Nein, es ist keine Auftragsarbeit.
D.h. es ist ein privates Spaßprojekt?

Auch habe ich keinen Skript Editor der mir einen solchen Compiler

bei der Installation mitliefert, um die von mir genannten Funktionen zu verwenden <stdio.h>

Und wie wendest du fgets an?

Für das Erstellen einer solchen "dll" brauchst Du vielleicht 10 min.

Bis ich mich da eingearbeitet habe, dauert es eine Ewigkeit.

Und die, die das in 10 Minuten können, mussten sich auch erst einmal einarbeiten. Sollte diese Investition sich nicht lohnen?

Übrigens, wenn das irgendeinen betrieblichen Kontext hat, solltest du [b]dringend[/b] mit deinem Vorgesetzten klären, ob du irgendwelchen fremden ausführbaren Code, dessen Inhalt und Funktion du nicht kennst und auch nicht prüfen kannst, einbringen darfst. In so eine DLL kann man so ziemlich alles reinstecken.

Link zu diesem Kommentar
Auf anderen Seiten teilen

fgets kommt normalerweise aus <stdio.h>.

fgets funktioniert aber.

Der Header der bei WinCC verwendet wird heisst apdefap.h

Wahrscheinlich ist fgets drin, aber die anderen Funktionen nicht

Warum versteifst du dich denn so auf eine DLL? Wenn du da so frei in C programmieren kannst, dass du fgets benutzen kannst, brauchst du weder eine Funktion noch eine DLL, das kannst du doch einfach so in deinen Code schreiben. Angenommen, zeile sei das char-Array, in das du mit fgets einliest, und du willst ab dem 7. Zeichen 10 Zeichen rauslesen:

char* substr = &zeile[6];

zeile[16] = '\0';

Dann zeigt substr auf den Teilstring, den du extrahieren willst. Allgemein setzt du einen Zeiger auf den Anfang des Teilstrings, und ersetzt das Zeichen dahinter durch ein Nullbyte, wodurch das Stringende markiert wird.

Der Zeiger ist aber nur solange gültig, wie das Array zeile existiert, wenn du den Inhalt länger brauchst, musst du ihn kopieren.

Ich habe das mal in einer WinCC - Schaltfläche programmiert:

#include "apdefap.h"

void OnClick(char* lpszPictureName, char* lpszObjectName, char* lpszPropertyName)

{

char zeile[] = "Ich bin ein String zum ausprobieren";

char* substr = &zeile[6];

zeile[16] = '\0';

printf( "'%s'\n", zeile );

}

Wenn ich die Schaltfläche drücke, wird mir "Ich bin ein Stri"

ausgegeben.

eigentlich müsste dann doch "n ein Stri" ausgegeben werden ?

Was mache ich falsch ?

D.h. es ist ein privates Spaßprojekt?

Meine Aufgabe besteht darin, bestehende Systeme zu optimieren.

Die hier gemachten Erkenntnisse können

möglicherweise später mit einfließen.

Und ja, es macht mir auch Spass....

Und wie wendest du fgets an?

FILE *ptr;

ptr = fopen("C:\\Temp\\Test.txt","r"); //Textdatei öffnen

fgets(data_1, 80, ptr); //Die Funktion "fgets" ließt eine Zeile komplett ein

Und die, die das in 10 Minuten können, mussten sich auch erst einmal einarbeiten. Sollte diese Investition sich nicht lohnen?

Übrigens, wenn das irgendeinen betrieblichen Kontext hat, solltest du dringend mit deinem Vorgesetzten klären, ob du irgendwelchen fremden ausführbaren Code, dessen Inhalt und Funktion du nicht kennst und auch nicht prüfen kannst, einbringen darfst. In so eine DLL kann man so ziemlich alles reinstecken.

Mir wäre es auch lieber ich bekomme es ohne "dll" hin,

insofern sich das mit den bestehenden Funktionen von WinCC machen läßt.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...