Datentyp String in C?
-
In C++ gibt es allerdings eine String-Klasse, die ähnlich der von Java ist.
Schau mal hier vorbei:http://www.fh-augsburg.de/informatik/vorlesungen/c_cplus/tutorial/henkel/Die_Klasse_string.html
-
-
loose schrieb:
In C++ gibt es allerdings eine String-Klasse, die ähnlich der von Java ist.
C ist nicht c++.
@OOAlbert: mit zusatz-libraries wie z.b. hier: http://bstring.sourceforge.net/features.html
(die zeile 'Usable in C' beachten)
-
hm, dann mal anders gefragt wenn ich dem char-array keine länge mitgeben, erweitert der sichd ann selbstständig, bzw. ist der dann dynamisch?
char a[] = "ABC";sowas wäre ganz nützlich wenn man zeilen unbekannter länge einlesen möchte.
-
Bei der Anweisung char a[] = "ABC"; werden automatisch 4 Byte Speicher reserviert. Wenn du aber im laufenden Programm Strings dynamisch speichern willst, musst du erst mit malloc() Speicher reservieren.
-
ich nochmal ... ich bin zwar der meinung das richtig gelesen zu haben mit den chars aber der compiler meckert immer nur.
Zur erklärung:
der soll die TXT öffnen, macht er auch. Dann soll er zeichen für zeichen auslesen und mittels strcat an den char-array b übergeben der wenn das zeilenumbruchszeichen gelesen wird ausgegeben wird, da die zeile ja beendet sein muß.Der compiler mein aber das wäre nicht richtig in der strcat-anweisung. In der refferenz stand aber das diese funktion problemlos den quellstring an den zielstring anheftet, bzw. das char-array auffüllt.
#include <stdio.h> #include <stdlib.h> #include <conio.h> #include <string.h> int main(void) { FILE *datei; datei = fopen("123.txt", "r"); if(NULL != datei) { printf("Konnte Datei öffnen!\n"); } char a; char b[100]; while ( a != EOF ) { a=fgetc(datei); strcat(b[100], a); if (a == '\n') { printf("%s", b); } } return 0; }
-
#include <stdio.h> #include <stdlib.h> #include <conio.h> #include <string.h> int main() { int a = 0; char aa[1000] = {0, }; char* b = aa; FILE *datei; datei = fopen("c:\\test.txt", "r"); if(NULL != datei) { printf("Konnte Datei oeffnen!\n"); } else return (-1); while (1) { a=(fgetc(datei)&0xff); if (a == EOF) break; strcat(b++, (char*)&a); if (a == '\n') { strcat(b, ""); printf("%s", aa); b = aa; b[0] = 0; } } return 0; }
-
War noch 'nen Fehler drinn, so:
#include <stdio.h> #include <stdlib.h> #include <conio.h> #include <string.h> int main() { int a = 0; char aa[1000] = {0, }; char* b = aa; FILE *datei; datei = fopen("c:\\test.txt", "r"); if(NULL != datei) { printf("Konnte Datei oeffnen!\n"); } else return (-1); while (1) { a=fgetc(datei); if (a == EOF) break; strcat(b++, (char*)&a); if (a == '\n') { strcat(b, ""); printf("%s", aa); b = aa; b[0] = 0; } } return 0; }
-
willy schrieb:
strcat(b++, (char*)&a);
Ich bezweifle, daß das etwas vernünftiges tut - strcat() erwartet, daß beide beteiligten Strings Null-terminiert sind - und das trifft auf a ziemlich sicher nicht zu.
(kleiner Tip: Es gibt auch eine Funktion fgets(), die du dir mal ansehen mußt ;))
-
Also ich hab mir das vorherige beispiel mal angeschaut und ich bin da noch nicht wirklich dahintergestiegen was da passiert. ich glaube aber das der char-array hochgezählt wird, dh. der index verschoben wird, damit der addierte char auf die nächste stelle kommt.
-
Hallo zusammen,
das Beispiel von willy könnte man wie folgt korrigieren!
#include <stdio.h> #include <stdlib.h> #include <string.h> int main() { int a = 0; char aa[1000] = {0, }; // diese Initialisierung finde ich nicht schön char* b = aa; FILE *datei; [b]char zeichen[2];[/b] datei = fopen("a.c", "r"); [b]if(datei == NULL) {[/b] [b]printf("Konnte Datei oeffnen!\n");[/b] [b]return (-1);[/b] [b]}[/b] while (1) { a=fgetc(datei); if (a == EOF) break; [b]sprintf(zeichen, "%c", a);[/b] //erzeugt einen 0-terminierten String [b]strcat(b, zeichen);[/b] // hier braucht b nicht hochgezählt werden if (a == '\n') { strcat(b, ""); printf("%s", aa); b = aa; b[0] = 0; } } return 0; }
Ich habe ein paar Kommentarzeilen im Quellcode hinzugefügt.
Die Initialisierung des Char-Arrays finde ich nicht schön, aber das ist Geschmacksache.
Besser fände ich:char aa[1000]; memset(aa, 0x0, 1000*sizeof(char));
Wobei man das sizeof(char) nicht braucht (ist per Standard 1byte groß).
Gruß mcr
-
Hallo,
ich habe noch mal über den Code geschaut und ein paar Zeilen geändert.
#include <stdio.h> #include <stdlib.h> #include <string.h> #define BUF_SIZE 1000 int main() { int a = 0, [b]l = 0[/b]; char aa[BUF_SIZE]; char* b = aa; FILE *datei; datei = fopen("a.c", "r"); if(datei == NULL) { printf("Konnte Datei oeffnen!\n"); return (-1); } [b]l = 0;[/b] [b]memset(aa, 0x0, BUF_SIZE*sizeof(char));[/b] while (1) { a=fgetc(datei); if (a == EOF) break; [b]sprintf(b+(l++), "%c", a);[/b] if (a == '\n' || [b]l == BUF_SIZE[/b]) { //[A] printf("%s", aa); [b]memset(aa, 0x0, BUF_SIZE*sizeof(char));[/b] [b]l = 0;[/b] } } return 0; }
[A]: die Abfrage l == BUF_SIZE sollte man hinzufügen, da es ja Zeilen in einer
Daten geben kann, die länger sind. Dann würde sprintf und auch strcat über
Arraygrenze schreiben, was nicht korrekt wäre.Diese Version benötigt kein strcat und arbeitet direkt auf dem Buffer aa.
Gruß mcr
-
ich hab auch nochmal etwas rumprobiert und unteranderem mal dieses "fgets" versucht. Wählt man den buffer groß genug bekommt man ja die gesamte zeile rein. Es hat auch den vorteil das man nur eine anweisung dafür braucht
Wie schaut es denn jetzt aus wenn man da feststellen will ob "\n" schon gekommen ist um zu merken das die zeile beendet ist, und darauf reagieren kann, gilt natürlich auch fpr das "EOF"?
Wie springt man dann in die nächste zeile wenn die erste ausgelesen ist?
-
Möchtest du die Zeilen einer Textdatei in ein Array schreiben oder was hast du vor ?
-
Du kannst dir mit ftell die Position des Dateizeigers geben lassen.
Mit fseek kannst du an eine bestimmte Position der Datei den Zeiger setzen.