kunert0345
Goto Top

Buchstabenweise in String schreiben

Hallo,

ich habe in dem Code eine Schleife die Buchstabenweise ein Text Datei verarbeitet und ich möchte bei jedem Durchlauf ein neuen Buchstaben in de string1 schreiben.
Leider funktioniert das nicht und ich weiß einfach nicht welchen Fehler ich gemacht habe .

Könnt Ihr mir bitte weiter helfen? face-smile

P.S.: Einen Überlaufschutz habe ich noch nicht eingebaut (ich werde bei einen zu hohen counter1 mit einer Fehlermeldung aussteigen ; -)

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main (void) {

    FILE *fp;
    char tmp1;
    char switch1 = '0';  
    char string1[255] = "";  
    size_t counter1 = '0';  

    fp = fopen ("config.conf", "r");  

    if(fp == NULL) {
        puts("ERROR: Konfiguration konnte nicht eingelesen werden, ueberpruefen Sie die config.conf Datei");  
        return 1;
    }
    else {
        //List Buchstabenweise die config datei
        while((tmp1 = fgetc(fp)) !=EOF) {
            //Die Leerzeichen löschung wird mit " an oder abgeschaltet 
            if('"' == tmp1) {  
                if(switch1 == '0'){  
                    switch1 = '1';  
                }
                else {
                    switch1 = '0';  
                }
            }
            //Leerzeichen löschung auser wenn " switch1 an ist und " zeichen löschen 
            if (!(((tmp1==' ') || (tmp1=='\t')) && (switch1=='0') || (tmp1=='"'))){  
                printf("%c", tmp1);  
                //variablen name einlesen
                string1[counter1] = tmp1;
                counter1++;
            }
        }
        string1[counter1] = '\0';  
        printf("%s", string1);  

        fclose (fp);
        return 0;
    }
}

Content-ID: 279091

Url: https://administrator.de/contentid/279091

Ausgedruckt am: 08.11.2024 um 19:11 Uhr

Lochkartenstanzer
Lochkartenstanzer 03.08.2015 um 14:00:17 Uhr
Goto Top
Zitat von @kunert0345:

Leider funktioniert das nicht und ich weiß einfach nicht welchen Fehler ich gemacht habe .

Was genau funktioniert denn nicht?


Könnt Ihr mir bitte weiter helfen? face-smile

Nur wenn du genauer sagst, was denn genau nicht funktioniert.


P.S.: Einen Überlaufschutz habe ich noch nicht eingebaut (ich werde bei einen zu hohen counter1 mit einer Fehlermeldung
aussteigen ; -)

Das soltlest Du gleich einbauen., daß wenn counter >254 wird, Du mit einer Fehlermeldung aussteigst.

>         printf("\n%s", string1);  
>         string1[counter1] = '\0';  
>        printf("%s", string1);  
 

Du solltest erst den String mit 0 terminieren, bevor Du ein printf drauf losläßt. Sinnvoller wäre es, string1 einfach mit nullen zu initialisieren, dann kann man das späte rnicht mehr vergessen.

lks
rubberman
rubberman 03.08.2015 um 14:00:20 Uhr
Goto Top
Hallo kunert0345.

Leider funktioniert das nicht und ich weiß einfach nicht welchen Fehler ich gemacht habe .
Was funktioniert nicht?

Kurzer Test.
Inhalt der Datei ist:
My "Hello World!" test.
Ausgabe:
MyHello World!test.

Wie sollte deiner Meinung nach die Ausgabe aussehen?

Grüße
rubberman
kunert0345
kunert0345 03.08.2015 um 14:06:58 Uhr
Goto Top
Inhalt der Datei ist:
quelle =	"C:\test test"  
Ausgabe:
quelle=C:\test test

Ich lese quelle ein und das bis das = kommt was es als Variablen Namen deklariert denn ich dann bei einer case Auswahl benutze.
Dann füttere ich die Variable mit dem Nachfolgenden Wert bis ein Enter Zeichen kommt.
Lochkartenstanzer
Lochkartenstanzer 03.08.2015 um 14:09:54 Uhr
Goto Top
Zitat von @kunert0345:

Inhalt der Datei ist:
quelle =	"C:\test test"  
Ausgabe:
quelle=C:\test test

Ich lese quelle ein und das bis das = kommt was es als Variablen Namen deklariert denn ich dann bei einer case Auswahl benutze.
Dann füttere ich die Variable mit dem Nachfolgenden Wert bis ein Enter Zeichen kommt.

Und was ist das Problem?

lks
rubberman
rubberman 03.08.2015 um 14:12:52 Uhr
Goto Top
Hallo kunert0345,

habe das jetzt mal nachvollzogen und die Ausgabe sieht genau so aus, wie von dir gewünscht.
Eine mögliche Fehlerquelle ist natürlich, dass deine Quelldatei keine ASCII Datei ist und der Zeichensatz sich mit der Verarbeitung als ASCII Text beißt. Um das aus der Ferne festzustellen, bräuchte ich aber eine Kristallkugel ...

Grüße
rubberman
kunert0345
kunert0345 03.08.2015 aktualisiert um 14:28:09 Uhr
Goto Top
Ich dachte eigentlich das mein counter1 bei
string1[counter1] = tmp1; 
hochgezählt wird.
Das mein String bei den Schleifen Durchläufen so gefüttert wird
string1 = t 
string1[1] = e
string1[2] = s
string1[3] = t
das ist aber leider nicht der Fall face-sad
rubberman
rubberman 03.08.2015 um 14:30:42 Uhr
Goto Top
Langsam, langsam! So wird es nur noch konfuser. Was soll dein Endergebnis sein? Du redest von Variablennamen etc...
Deine Ausgangszeile ist
quelle =	"C:\test test"
Verstehe ich das nun richtig, dass du 2 Pointer haben willst?
Einer der auf
quelle
als nullterminierten String zeigt und einer der auf
C:\test test
als nullterminierten String zeigt?
kunert0345
kunert0345 03.08.2015 um 14:54:27 Uhr
Goto Top
Was soll dein Endergebnis sein?
string1 soll mit dem Inhalt von tmp1 (Was bei jedem Schleifendurchlauf ein neues Zeichen enthält ) gefüllt werden.

Den Rest denn ich mit dem Leerzeichen und Enter gemeint habe muss ich noch programmieren aber wie gesagt ich bekomme es ja nicht mal hin mit
string1[counter1] = tmp1; 
meinen string zu füllen.
Lochkartenstanzer
Lochkartenstanzer 03.08.2015 um 14:58:18 Uhr
Goto Top
Zitat von @kunert0345:

Was soll dein Endergebnis sein?
string1 soll mit dem Inhalt von tmp1 (Was bei jedem Schleifendurchlauf ein neues Zeichen enthält ) gefüllt werden.

Den Rest denn ich mit dem Leerzeichen und Enter gemeint habe muss ich noch programmieren aber wie gesagt ich bekomme es ja nicht
mal hin mit
string1[counter1] = tmp1; 
meinen string zu füllen.

Ich vestehe jetzt Dein problem nicht. Der Stript wird doch gefüllt.

lks
kunert0345
kunert0345 03.08.2015 um 15:05:37 Uhr
Goto Top
Wenn ich am Ende den string1 mittels
        string1[counter1] = '\0';  
        printf("%s", string1);  
ausgäben will kommt da gar nichts.

Das Einzige was ich sehe ist der tmp1 Wert der zu Kontrollzwecken bei jeder Schleife mittels
printf("%c", tmp1);  
ausgegeben wird.

Wenn string1 gefüllt wehre müsste er nach der Schleife angezeigt werden !? (So das die Ausgabe 2 mal auf dem Bildschirm erscheint)
Lochkartenstanzer
Lochkartenstanzer 03.08.2015 um 15:12:38 Uhr
Goto Top
Zitat von @kunert0345:

>         string1[counter1] = '\0';  
>         printf("%s", string1);  
> 

mach da einfach mal ein printf ("%c %d\n", tmp1, counter1); daraus. Dann siehst Du, was da passiert.

lks
kunert0345
kunert0345 03.08.2015 um 15:21:47 Uhr
Goto Top
Wenn ich
printf ("%c %d\n", tmp1, counter1);   
in die Schleife einbaue bekomme ich
t 48
e 49
s 50
t 51

Warum zählt er ab 48
ich hab doch
size_t counter1 = '0';  
geschrieben.
kunert0345
kunert0345 03.08.2015 um 16:02:55 Uhr
Goto Top
und wenn ich nur
printf ("%c\n", counter1);  
einbaue bekomme ich
0
1
2
3

jetzt versteh ich garnichts mehr ???
Lochkartenstanzer
Lochkartenstanzer 03.08.2015 um 16:03:19 Uhr
Goto Top
Zitat von @kunert0345:

Warum zählt er ab 48
ich hab doch
size_t counter1 = '0';  
geschrieben.

Eben. '0' ist Zeichen 48. face-smile

lks

PS: Ist mir aber beim durchauen Deines Codes aber zuerst nciht aufgefallen.

lks
Lochkartenstanzer
Lösung Lochkartenstanzer 03.08.2015 aktualisiert um 16:15:18 Uhr
Goto Top
Zitat von @kunert0345:

und wenn ich nur
printf ("%c\n", counter1);  
einbaue bekomme ich
> 0
> 1
> 2
> 3
> 

jetzt versteh ich garnichts mehr ???

Ja, weil 48 der Ascii-Code von dem Zeichen '0' ist und nicht die null selbst.

lks

PS: Du sollest Dich mal über Zeichenkodierung datentype, Darstellung der Datentypen und den Unterschied zwischen Darstellg und und Repräsentation Gedanken machen. Vergleiche auch c'est ne pas une pipe von René Magritte.
kunert0345
kunert0345 03.08.2015 um 16:11:03 Uhr
Goto Top
Es gibt wirtlich noch einiges was ich lernen sollte.
Ist auch mein erstes C Programm vorher hatte ich nur in php gecodet face-confused

Aber den noch hänge ich daran fest das mein string1 nicht gefüllt wird.
Das ist immer das Problem wenn man niemanden kennt der programmieren kann und so nervt man immer Leute in Foren mit den eigenen Anfänger Fehlern face-sad
kunert0345
kunert0345 03.08.2015 um 16:26:22 Uhr
Goto Top
[LÖSUNG]
Es heißt
size_t counter1 = 0;
und nicht
size_t counter1 = '0';  

Danke Lochkartenstanzer und rubberman für Eure Engelsgeduld mit mir face-smile)
Lochkartenstanzer
Lochkartenstanzer 03.08.2015 um 18:05:04 Uhr
Goto Top
Zitat von @kunert0345:

[LÖSUNG]
Es heißt
size_t counter1 = 0;
und nicht
size_t counter1 = '0';  

Jepp. Ich hoffe Du hast bei der Fehlersuche was gelernt. Ich halte nämlich nichts davon einfach die fertige Lösung hinzuschreiben, weil dann die Leute den Fehler nicht sehen und dann auch ncihts daraus lernen. Der Hinweis auf den Datentyp sollte normalerweise reichen, um den Fehelr zu finden. Ich habe den übrigens auch erst gesehen, nachdem Du oben dieAusgabe des Statements gepostet hast, den ich hingeschrieben habe.


Danke Lochkartenstanzer und rubberman für Eure Engelsgeduld mit mir face-smile)

Keine Ursache.

Du slltest Dir eventuell ein lehrbuch zu C holen udn das dann ducchackern. Un noch zusätzlich eine C/C++-referenz zum nachschlagen

lks
kunert0345
kunert0345 04.08.2015 um 11:49:43 Uhr
Goto Top
Ich benutze ein C Buch und das Internet aber mit Durchackern funktioniert bei mir nicht.
Bei meiner Ausbildung damals zum Assistent für Informatik habe ich nichts verstanden im Programmier Kurs.
Erst als ich durch eine Verletzung Wochenlang im Bett lag habe ich mir Autodidakt php beigebracht.
rubberman
rubberman 04.08.2015, aktualisiert am 06.08.2015 um 13:04:00 Uhr
Goto Top
Grundsätzlich gebe ich ja lks Recht. Vorgekauter Code hilft nur wenig. Da das hier aber bereits gelöst ist, mal ein Vorschlag mit voll durchkommentiertem Code (natürlich in der Hoffnung dass die Kommentare gelesen werden und der Code verstanden wird). Ich bin in meinem Test davon ausgegangen, dass irgendwo folgende Zeile existiert:
quelle =	"C:\test test"
Ich benutze Funktionen, die ich bereits ins Netz gestellt habe und (da Administrator.de Code immer in voller Länge anzeigt) hier nicht noch mal kopieren will. Also kopiere dir die Funktionen von diesen Links und hänge sie an den Code an:
ReadLineCopy
SplitAlloc und SplitFree
Trim

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#ifndef PATH_MAX
#define PATH_MAX 260
#endif // PATH_MAX

int ReadLineCopy(FILE *const pFile_in, char *const szLine_inout, const size_t cSize_in, size_t *const pcchLength_out);
int SplitAlloc(const char *const str, const char *const delims, const int mergeDelims, const size_t maxTok, char ***const pTokens, size_t *const pTokCount);
void SplitFree(char ***const pTokens, const size_t tokCount);
int Trim(char *const str, const char *const charlist, const unsigned mode, size_t *const pLen);

int main(void)
{
  const char filename = "config.conf", //Dateiname  
             delims = "=", // Trennzeichen in der Zeile  
             trimlist = " \t\"", // voran- und nachgestellte Leerzeichen, Tabs und Anführungszeichen sollen erntfernt werden  
             searchstr = "quelle"; // Eintrag, nach dem gesucht werden soll  

  FILE *fp = NULL; // File-Pointer
  char line[1024] = {0}, // Puffer für den Inhalt einer gelesenen Zeile
       **tokens = NULL, // Pointer auf die Teilstrings der Zeile
       sourcepath[PATH_MAX] = {0}; // gelesener Wert für die "quelle" 
  size_t tokenscount = 0, // Anzahl erzeugter Teilstrings
         sourcelen = 0; // Länge des gelesenen Pfades

  if(!(fp = fopen(filename, "r"))) // Datei zum Lesen öffnen  
  {
    puts("ERROR: Konfiguration konnte nicht eingelesen werden, ueberpruefen Sie die config.conf Datei");  
    return 1;
  }

  while(ReadLineCopy(fp, line, sizeof(line), NULL) == 0) // Zeilenweise aus der Datei lesen
  {
    if (SplitAlloc(line, delims, 0, 2, &tokens, &tokenscount) == 0) // Am ersten = in 2 Teilstrings splitten und in ein Array kopieren
    {
      if (tokenscount == 2 // Wenn die Zeile min. ein = beinhaltet hat ...
          && Trim(tokens, trimlist, 1 | 2, NULL) == 0 // Umschließende Leerzeichen und/oder Tabs und/oder Anführungszeichen vom ersten Teilstring entfernen
          && Trim(tokens[1], trimlist, 1 | 2, &sourcelen) == 0) // Umschließende Leerzeichen und/oder Tabs und/oder Anführungszeichen vom zweiten Teilstring entfernen
      {
        printf("'%s' '%s'\n", tokens, tokens[1]); // Testausgabe  

        if (strcmp(tokens, searchstr) == 0 && sourcelen < PATH_MAX) // Wenn der erste Teilstring "quelle" ist und der zweite Teilstring in sourcepath passt, ... 
          strncpy(sourcepath, tokens[1], sourcelen + 1); // ... zweiten Teilstring incl. Nullterminierung nach sourcepath kopieren
      }

      SplitFree(&tokens, tokenscount); // Die durch SplitAlloc reservierten Speicherbereiche freigeben
    }
  }

  fclose(fp); // Datei schließen

  printf("\n\nResultat:\n%s\n", sourcepath); // Gefundenen Pfad ausgeben  
  return 0;
}
Schau mal, ob das etwas ist, was dem nahe kommt, was du suchst.

Grüße
rubberman