Character aus String entfernen



  • sega schrieb:

    Janjan schrieb:

    Schnapp dir dein Buch und schlag das Kapitel über Zeiger nach. Dann lies noch die Dokumentationen zu den einzelnen Befehlen. Wenn du jetzt noch dein Hirn einschaltest und überlegst was du eigentliche machen willst und mit bestimmten Code machst, dann bist du der Lösung schon einen großen Schritt weiter.

    Ich schlage im Gegenzug vor, dass ihr mir sagt, in welchem Forum man als Anfänger bessere Hilfe bekommen kann. Die Antworten hier im Forum sind etwas zu fortgeschritten für meinen Geschmack und auf 'RTFM' wäre ich auch selbst gekommen.

    Nirgends? Junge, wenn du was gebacken haben willst, musst du schon Eigenleistung zeigen. Was würde dir bringen, wenn man dir alles aufm Silbertablett presentiert? Nichts.

    Was Janjan schrieb klingt sehr harsch aber glaub mir, er hat mit der Sache 100% Recht und wenn du selbst auf RTMF gekommen bist, wieso tust du das denn nicht? erwartet nicht von uns, uns das Lernen zu überlassen. Denken, überlegen, usw. musst du nämlich immer noch selber. Dran führt kein Weg vorbei und wenn du das nicht einsiehst, wirst du früher als später scheitern.



  • Alles klar, ich frage nicht weiter.
    Thread bitte schließen.



  • wieso tust du hier die beleidigte Wurst ab?



  • Lass ihn doch, wahrscheinlich hat er sich das Ganze mit dem Forum anders vorgestellt...



  • Allerdings, und beleidigt würde ich das nicht nennen.
    Eher einsichtig, ich bin ja jetzt informiert: http://www.c-plusplus.net/forum/viewtopic-var-t-is-136013.html



  • wxSkip schrieb:

    strchr() gibt keinen char zurück, sondern einen Zeiger auf einen char.
    Das heißt hinter dem char, dessen Adresse der Zeiger speichert, steht der Rest des Strings. Und damit kannst du was anfangen.

    PS: Ich glaube, wenn man ein paar Hundert Beiträge mehr geschrieben hat als ich, nervt es viele auch ein bisschen, wenn immer die gleichen Fragen zu Zeigern usw. auftauchen. Schließlich steht das alles schon in vielen Büchern geschrieben, warum sollte man sich immer wiederholen?
    Ich persönlich kann dir nur zu einem Buch raten, in anderen Foren wird es auch nicht anders sein, schließlich tritt man einem Forum ja nicht nach Gutmütigkeit oder Geduldigkeit bei, sondern nach Thema.

    Erstmal: Das Kapitel über Zeiger (C von A bis Z) habe ich jetzt gelesen.

    Dachte auf den ersten Blick ich könnte meine Probleme mit diesem Indirektionsoperator lösen - leider nicht.

    Aus der CSV-Textdatei kommen zeilenweise Daten (im char c[10000]), die ich mit

    strToken(c,";",lineToken);
    

    von ihren Trennzeichen befreie. Die Funktion sieht so aus:

    int strToken(char *str, char *separator, char *token[])
    {
    	int i = 0;
    
    	token[0] = strtok(str,separator);
    
    	while ( token[i] ) {
    		i++;
    		token[i] = strtok(NULL, separator);
    	}
    
    	return ( i );
    }
    

    Das lineToken ist bei mir ein pointer (char *lineToken[1000]).
    Wenn ich auf lineToken[0] zugreife bekomme ich die Ausgabe: #1.
    Genau richtig, denn er erste Eintrag in der CSV-Datei ist #1.

    Jetzt möchte ich diesen Eintrag (also #1) vom Zeichen # befreien. So gedacht:

    char *pos;
    pos = strchr(lineToken[0],'#');
    		if (pos != NULL){
    			memmove(pos,pos+1,strlen(pos));
    		}
    

    Läuft leider nicht, weil der pos immer NULL ist.

    Dachte zumindest im memmove müsste dann an Stelle von pos, *pos stehen, aber bis dahin kommt das Programm ja schon nicht.

    Falls noch jemand bereit ist was dazu zu sagen, würde ich mich freuen.



  • Das memmove stimmt schon, kannst du mal den relevanten Codeausschnitt am Stück posten? Mir ist der Fehler nicht ersichtlich.



  • Das hier ist der ganze Abschnitt:

    DEFINE_ON_DEMAND(readFile)
    {
    
    	char *pos;					
    	int i = 0;
    	int zeile = 0;				/* Zeilennummer in der Datei */
    	char *lineToken[1000];		/* Teile einer Zeile */
    	char c[10000];  		  	/* Char-Array, in dem der Dateiinhalt ZEILENWEISE abgelegt werden */
    
    	FILE *file;
    
    	file = fopen("reacdat.csv", "r"); 
    
      if(file==NULL) {
        Message0("Error: can't open file.\n");
        /* fclose(file); DON'T PASS A NULL POINTER TO fclose !! */
      }
      else {
    
        Message0("File opened successfully. Contents:\n\n");
    
        while(fgets(c, 10000, file)!=NULL) { 		/* Schleife durch die Zeile, bis zum NULL-Pointer */
    												/* Das Zeilenende wird als NULL-Pointer (Error) gewertet */
    
    		zeile++;
    
    		strToken(c,";",lineToken);				
    
    		/* Ab hier liegt die Zeile aufgespaltet in lineToken vor */
    
    		if (zeile == 18){
    			Message0("Zeile 18\n");
    			Message0("Eintrag 1: %s.\n",lineToken[0]);
    
    		}
    
    		Message0("lineToken[0]: %s\n",lineToken[0]);
    
    		pos = strchr(lineToken[0],'#');
    		if (pos != NULL){
    			memmove(pos,pos+1,strlen(pos));
    		}	
    
        }
    
        Message0("\n\nNow closing file...\n");
        fclose(file);
      }
    
    }
    
    int strToken(char *str, char *separator, char *token[])
    {
    	int i = 0;
    
    	token[0] = strtok(str,separator);
    
    	while ( token[i] ) {
    		i++;
    		token[i] = strtok(NULL, separator);
    	}
    
    	return ( i );
    }
    


  • So, bei mir funktioniert dieser Code:

    int strToken(char *str, const char *separator, char *token[])
    {
        int i = 0;
    
        token[0] = strtok(str,separator);
    
        while ( token[i] ) {
            i++;
            token[i] = strtok(NULL, separator);
        }
    
        return ( i );
    }
    
    int main()
    {
    
        char *pos;
        int zeile = 0;                /* Zeilennummer in der Datei */
        char *lineToken[1000];        /* Teile einer Zeile */
        char c[10000];                /* Char-Array, in dem der Dateiinhalt ZEILENWEISE abgelegt werden */
    
        FILE *file;
    
        file = fopen("bsp.txt", "r");
    
      if(file==NULL) {
        printf("Error: can't open file.\n");
        /* fclose(file); DON'T PASS A NULL POINTER TO fclose !! */
      }
      else {
    
        printf("File opened successfully. Contents:\n\n");
    
        while(fgets(c, 10000, file)!=NULL) {         /* Schleife durch die Zeile, bis zum NULL-Pointer */
                                                    /* Das Zeilenende wird als NULL-Pointer (Error) gewertet */
    
            zeile++;
    
            strToken(c,";",lineToken);
    
            /* Ab hier liegt die Zeile aufgespaltet in lineToken vor */
    
            if (zeile == 18){
                printf("Zeile 18\n");
                printf("Eintrag 1: %s.\n",lineToken[0]);
    
            }
    
            printf("lineToken[0]: %s\n",lineToken[0]);
    
            pos = strchr(lineToken[0],'#');
            if (pos != NULL){
                memmove(pos,pos+1,strlen(pos));
            }
            else printf("pos == NULL\n");
    
        }
    
        printf("\n\nNow closing file...\n");
        fclose(file);
      }
    
    }
    

    mit diesem Dateiinhalt:

    asfd#asdf;abc;def;ghi
    


  • Hm, sehe da gar keinen Unterschied.
    Warum klappt das bei mir nicht?

    Das ist übrigens der Dateiinhalt:

    #1;FeS[s];#;#;#;#;#; ===>;Fe[s];0.5 S2[g];#;#;#;#
    

    Gibts Probleme, weil das zu entfernende Zeichen am Anfang steht?



  • Auch das funktioniert.
    Ich hab noch eine Ausgabe des modifizierten Strings hinzugefügt:

    File opened successfully. Contents:
    
    lineToken[0]: #1
    lineToken[0] after modification: 1
    
    Now closing file...
    
    Process returned 0 (0x0)   execution time : 0.033 s
    Press any key to continue.
    


  • sega schrieb:

    Hm, sehe da gar keinen Unterschied.

    Ich habe folgendes verändert(sofern ich das noch zusammenkriege):
    1. Funktion nach oben verschoben
    2. den 2. Parameter const gemacht
    3. die Ausgabe nach dem strchr()


Anmelden zum Antworten