String kürzen..



  • Hm, nein, ich will ja nicht " ersetzen, sondern das erste zeichen des char, Also, nchmal etwas genauer, ich habe einfach ein wort, nehmen wir zum beisiel mal Test, jetzt muss ich aus Test das wort est machen, wenn es jetzt aber zb Molloch währe, müsste ich olloch darraus machen, also das erste zeichen entfernen, ausredieren, wegnehmen, klauen oder was auch immer^^ Das wort muss um eins kürzer werden, und das ganze am anfang des wortes, das ist mein problem, ich will nicht gezielt einen bestimmtes zeichen kicken, sondern eben dass, welches an erster stelle steht. Oder ich bin heute einfach schwer von begriff 😕



  • Hallo,

    öhm na dann

    void foo(char *text){
      *(text+strlen(text))='\0';
      text+=1;
    }
    


  • Also, wenn ich dich richtig verstanden habe, dann meintest du das so:

    void cuts(char *text){ 
      *(text+strlen(text))='\0'; 
      text+=1;
      printf("%s", text);
    } 
    
    int main(int argc, char *argv[])
    {
      int len, i, x, argcx=5;
      char *temp, *argvx[5];
      argvx[1] = "Das";
      argvx[2] = "ist";
      argvx[3] = "ein";
      argvx[4] = "test";
      for(i=1; i<argcx; i++)
      {
        if( i == 1 )
        {
          cuts(argvx[i]);
        }
        else
        {
          printf(" %s", argvx[i]);
        }
      }
      return 0;
    }
    

    Jetzt bekomm ich leider immer den fehler "etecho.exe hat fehler verursacht und wurde geschlossen", beim Compilieren bekomm ich keine fehlermeldung 😕



  • Hallo,

    char *temp, *argvx[5];
      argvx[1] = "Das";
      argvx[2] = "ist";
      argvx[3] = "ein";
      argvx[4] = "test";
    

    ein Arry beginnt beim 0ten Element.
    Hmm wenn ich mich nicht irre müsste mein Methode eigentlich Funktionieren. Wenn sich rausstellt, dass sie für den Fehler verantwortlich ist, kannst du ja noch mal posten.



  • Hi!
    Nein, ich beginne bei 1 weil später bei den argumenten 0 ja der pfad des progs selber ist, und mit argvx und argcx simmulier ich das gerade nur sozusagen^^
    Bin schon ein wenig weiter:

    void cuts(char *text){ 
      text+=1;
      printf("%s", text);
    } 
    
    void cute(char *text){ 
      text-=1;
      printf("%s", text);
    } 
    
    int main(int argc, char *argv[])
    {
      int i, x, argcx=5;
      char *argvx[5];
      argvx[1] = "\"Das";
      argvx[2] = "ist";
      argvx[3] = "ein";
      argvx[4] = "test\n\"";
      x = argcx;
      x--;
      cuts(argvx[1]);
      for(i=2; i<x; i++)
      {
        printf(" %s", argvx[i]);
      }
      cute(argvx[--argcx]);
      return 0;
    }
    

    Jetzt ist es fast perfekt, nur funktion cute sollte eigendlcih den letzen buchgtsaben wegnehmen, nicht das ganze wort, dass mit dem text-=1; hab cih auch leider nciht so ganz verstanden, habs einfach so probiert und ging, vll kann mir das ja einer erklähren, villeicht komm ich dann drauf, wie ich diesmal den letzten buchstaben wegbekomm, ich will ja auch vertsehen was ich da mache 😉



  • Hallo,

    welchen Compiler benutzt du denn ?
    Ich hatte eben beim test auch nen merkwürdiges Ergebnis. Normalerweise sollte strlen die Länge des Strings ohne das Terminierungszeichen zurück geben.
    Bei BCB 6 musste ich schreiben strlen(text)-1 um an das letzte Zeichen zu kommen.

    Das mit den Additionen nennt sich Zeigerarithmetic. Dein Zeiger zeigt auf die Addresse des ersten Zeichens in deinem String. Wenn ich den Zeiger nun incrementiere (sprich 1 addiere) dann zeigt der auf die Addresse des zweiten Zeichens usw.

    Was ich also eigentlich vorhatte war.

    char *text="test";
    
    *(text+strlen(text))='\0'; //ersetze das letzte Zeichen durch Terminierung
    text+=1; //jetzt sollte text eigentlich auf e zeigen.
    

    Warum das nicht der Fall ist, intressiert mich jetzt selbst.



  • Hmm..
    Also, das erste zeichen wird bei mir ja entfernt..
    Nur das mit dem letzen hab ich ncoh ein problem, warum das mit text+=1 geht.
    UNd dass *(text+strlen(text))='\0'; soll folglich das letze zeichen wegmachenn, also sozusagen 1 zeichen zurück, dann währen aber doch 2 terminierungszeichen hinterinander, ist das egal?
    Und ich benutze devCpp..
    Edit:
    Also, *(text+strlen(text))='\0'; bringt bei mir das programm zum Fehler, allerdings kann cih auch dem Debug nciht entnehmen zu welchem.. wenn cih strlen(text)-1 mache ist da kein unterschied..



  • MC_Breit schrieb:

    Hmm..
    Nur das mit dem letzen hab ich ncoh ein problem, warum das mit text+=1 geht.
    UNd dass *(text+strlen(text))='\0'; soll folglich das letze zeichen wegmachenn, also sozusagen 1 zeichen zurück, dann währen aber doch 2 terminierungszeichen hinterinander, ist das egal?

    Ja das ist egal. Die Ausgaberoutine gibt nur bis zum ersten Terminierungszeichen aus.

    Hmm der Rest ergibt für mich keinen Sinn.



  • Hmm, ist schon komisch, ich verstehe ja jetzt wie du es angegangen währst, aber es geht irgendwie einfach nicht..
    Es muss doch eine andere möglichkeit geben, das letze zeichen zu entfernen bzw nicht auszugeben!?



  • Hmm ja gibt es schön aber das ist irgendwie nicht so toll.

    for(int i=1;i<(strlen(text)-1);i++)
      printf("%c",text[i]);
    


  • Nagut, mit meinen selbst reingeschirbenen variablen hat das ja jetzt noch funktioniert..
    Aber irgendwie mit den argumenten klappt es nciht so ganz 😞
    Ich hab das ganze jetzt so:

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    void cuts(char *text){ 
      text+=1;
      printf("%s", text);
    } 
    
    void cute(char *text){
      int i;
      printf(" ");
      for(i=0;i<(strlen(text)-1);i++) 
        printf("%c",text[i]);
    } 
    
    int main(int argc, char *argv[])
    {
      if( argc == 2 && argv[2] == '/?' )
        printf("\nSUBECHO [String]\n\n  Gibt einen string der aus\n  mindestens 2 woertern bestehen\n  muss ohne sein erstes und letztes\n  zeichen aus.\n\n");
      else if( argc < 3 )
        printf("Fehler! Es muessen mindestens 2 woerter uebergeben werden! /? fuer hilfe..\n");
      else
      {
        int i, x;
        argc--;
        cuts(argv[1]);
        for(i=2; i<argc; i++)
          printf(" %s", argv[i]);
        cute(argv[argc]);
      }
      return 0;
    }
    

    UNd zum aufrufen hab ich dann folgendes batch:

    @echo off
    SUBECHO "Das ist ein Test mit vielen woertern"
    PAUSE
    SUBECHO "Mit Zwei"
    PAUSE
    

    Das resultat sieht jedoch so aus:

    Fehler! Es muessen mindestens 2 woerter uebergeben werden! /? fuer hilfe..
    Drücken Sie eine beliebige Taste . . .
    Fehler! Es muessen mindestens 2 woerter uebergeben werden! /? fuer hilfe..
    Drücken Sie eine beliebige Taste . . .
    

    Jemand ne idee, wo der fehler von mir ist?



  • Hallo,

    probiers mal mit

    SUBECHO Das ist ein Test mit vielen woertern
    

    Ohne die ".



  • Also meine Funktion zum Kürzen des Strings würde so aussehen:

    char * delfirstlast(char * text)
    {
       text[strlen(text)-1] = 0; //letztes Zeichen entfernen
       strcpy(text, text+1); //erstes Zeichen entfernen
    
       return(text); //gekürzten String zurückgeben
    }
    

    MC_Breit schrieb:

    if( argc == 2 && argv[2] == '/?' )
    

    Genau in dieser Zeile liegt der Fehler. In '' darf nur ein Zeichen stehen. Und wenn man Strings vergleichen will, dann bringt == nichts. Das muss z. B. mit strcmp() gemacht werden!


Anmelden zum Antworten