C Strings ohne string.h bearbeiten

NutsGul

Lt. Commander
Registriert
Okt. 2007
Beiträge
1.215
guten Tag,

Ich habe ein Problem, ich arbeite mit den arm-elf Compiler und kann deswegen keine funktionen aus String.h benutzen. Jetzt habe ich leider keine ahnung wie ich z.B. den inhalt einen Strings kopieren oder 2 strings zusammerfügen kann.

Mit string.h wäre das kein problem, aber so habe ich echt keine Ahnung. ich wäre für eure hilfe sehr dankbar.
 
warum sollte string.h nicht mit nem arm-elf compiler funktionieren? du verwendest doch gcc oder?

string.h ist teil der c standardbibliothek, die sollte eigentlich bei allen compilern mit im boot sein.
 
Eben nicht!^^
Sobalt ich eine Funktion aus der string.h benutzte, gibt er mir einen Fehler aus von wegen "undefined reference to 'strcpy'...

Deswegen bräuchte ich eine Möglichkeit wie ich das ohne string.h lösen kann.
 
Code:
typedef size_t unsigned int; // kannst du weg lassen wenn size_t schon irgendwo definiert wurde

size_t stringlength( const char *string )
{
  size_t len = 0;
  while( string[len] != '\0' ) ++len;
  return len;
}

char *stringcopy( const char *string )
{
  size_t len = stringlength( string );
  char newstring = new char[len + 1];
  for( size_t i = 0; i < len; i++ ) newstring = string[i];
  newstring[len] = '\0';
  return newstring;
}

char *stringappend( const char *string1, const char *string2 )
{
  size_t len1 = stringlength( string1 ), len2 = stringlength( string2 );
  char newstring = new char[len1 + len2 + 1];
  for( size_t i = 0; i < len1; i++ ) newstring[i] = string1[i];
  for( size_t i = 0; i < len2; i++ ) newstring[i] = string2[i];
  newstring[len1 + len2] = '\0';
  return newstring;
}
kurz mal hingeschrieben. können vllt noch fehler drin sein, aber ich denke, die bekommst du dann glatt gebogen. sollte aber eigentlich so stimmen. das was du eigentlich nur wissen musst ist, dass ein string nichts weiter als ein char-array ist. das ende kannst du dabei erkennen, wenn ein '\0' auftritt.
 
Danke für die schnelle Antwort aber kann es sein das das in C++ geschrieben ist?
Wenn ich versuche das zu compilieren, gibt er mir als Fehlermeldung z.b. aus "main.c:54: error: 'for' loop initial declaration used outside C99 mode"
Auserdem benutzt du new und das gibts doch erst in c++ wenn ich mich net täusche.

Also stehe ich jetzt grad voll auf der Leitung oder is das nicht in C geschrieben?
 
NutsGul schrieb:
Sobalt ich eine Funktion aus der string.h benutzte, gibt er mir einen Fehler aus von wegen "undefined reference to 'strcpy'...
Die ist aber ein Linkerfehler. Und es heißt, dass die string.h auf jeden Fall schonmal vorhanden ist.

Hast du mal gesucht, ob eine libc.so oder libc.a auf dem System rumfliegt?

Oder einfach mal mit -lc gelinkt?
 
jo ich hab die string.h grade gefunden, wenn ich sie öffne steht nur drin:"This is a dummy <sys/string.h>".
Also brauch ich jetzt entweder eine ander string.h datei oder ich muss es ohne machen.
 
So die string.h ist jetzt vollständig. Eine libc.so habe ich nicht gefunden, aber ungefähr 30 libc.a.
 
Zuletzt bearbeitet:
"undefined reference to 'strcpy'..." hat nichts mit der string.h zu tun. ebenso wenig mit dem compiler. das is ein linker-fehler! und er bedeutet nichts anderes als dass du keine bibliothek angegeben hast, die die funktion strcpy enthält. libc sollte sie enthalten. also beim linker einfach -lc als argument mit angeben.

dazu sollte natürlich die komplette toolchain für den cross-compiler installiert sein, insbesondere eine libc als arm-elf build.
 
Zuletzt bearbeitet:
Ich werd noch Verückt. Ich habs jetzt alles versucht, libc.a einbinden bring auch nichts. genauso wie jede andere c Libary die ich gefunden habe. Er bringt immer den gleichen Fehler.
 
Hast du eine Crosskompilierte libc? Wahrscheinlich nicht. Also kompilier dir eine. Problem gelöst.
 
Hallo,

hier mal einige Erklärungen:

string.h ist definitiv eine C Standartbibliothek, jeder halbwegs vernünftige Compiler sollte die also kennen (sogar Microcontroller-C-Crosscompiler haben sowas).

Eine Lib.a wirst Du nicht im C-Programm einbinden können (falls Du das versucht haben solltest), sondern musst Du erst bein Linken angeben. Die Erweiterung .a steht für Assemby, der C-Compiler selbst kann damit überhaupt nichts anfangen.

Falls Du wider erwartend string.h wirklich nicht benutzen kannst (es gibt solche Situationen durchaus, auch wenn sie sehr selten sind) ist es, falls Du nicht sehr komplexe Sachen machen willst, sehr einfach sich das ganze selber zu bauen.

Anstatt dem Datentyp string kannst Du auch ein char-Array verwenden, also z.B.

char myArray[14] = "Hello World!";

Nichts anderes ist ein String im eigentlichen Sinne. Wenn Du das ganze wirklich selber schreiben willst/musst, wirst Du nicht drum rum kommen dich näher damit auseinander zu setzten. So musst Du z.B. wissen wie Arrays genau Funktionieren, das Strings in C immer mit einem \0 abschließen usw... Im Netz gibt es dazu allerdings sehr viel Dokumentation und mit Sicherheit auch schon fertige Lösungen - Informatikprofessoren (auch meiner) lieben es nämlich Funktionen und Deklarationen der STL nach programmieren zu lassen ;)
 
@xatru:
In C gibt es nur char arrays dir als Strings behandelt werden können.
Was du meinst, ist C++ ;)
 
Zurück
Oben