String von rechts ausgeben.



  • Hallo,

    ich muss einen String von rechts ausgeben und das ohne vordefinierte Funktionen.

    Angabe:
    Funktion 2:

    void right( char source [], int n, char target[] )
    Schneidet die letzten n Zeichen aus dem Quellstring source aus und speichert die Zeichen in dem String target ab.

    Die erste Aufgabe war die ersten n Zeichen von links auszugeben, was auch kein Problem war, nur weiss ich nicht wie ich von rechts vorgehen soll.

    Mein Ansatz für die Funktion von links war:

    void left(char source[], int n, char target[])
    {
        int i;
    
        for(i=0; i<=n; i++)
        {
            printf("%c", source[i]);
        }
    }
    

    Kann mir von euch jemand sagen wie man das umschreibt, sodass er die letzten n Zahlen ausgibt??

    Gemeint ist, wenn die Source z.b.: "Hallo das ist ein Test" ist, und n=4, dann soll Test ausgegeben werden und nicht tseT

    Vielen Dank schonmal.



  • Ende vom String finden und von dort aus rückwärts ausgeben.

    💡 Das Stringende ist '\0' (das Zeichen mit dem Wert 0)



  • Das weiss ich, aber wenn ich vom Ende her ausgeb, dann kommt doch auch der string von rechts nach links, Ich soll aber z.b. Wenn ich einen String von 10 Elemente habe und n=5 setzte, die ersten 5 übersprungen werden und dann die 5, die sich jetzt noch im String befinden normal (also von links nach rechts) ausgeben.



  • So das Bsp. in der Angabe sieht so aus.

    char target[20];

    right( "Hallo wie gehts wie denn", 4, target )
    --> target = "denn"



  • *hint* *hint*

    Welchen index im String hat den das 'T' von 'Test'?
    Und wie hängt der Index mit der 4 und der Gesamtlänge des Strings zusammen?



  • Hier das Bsp. von Links.

    #include <stdio.h>
    #include <stdlib.h>
    
    void left(char source[], int n, char target[])
    {
        int i;
    
        for(i=0; i<=n; i++)
        {
            printf("%c", source[i]);
        }
    }
    
    int main()
    {
    
        char target[20];
    
        left("Hallo wie geht es",9, target);
    
    }
    

    Als Ergebnis wurde eben "Hallo wie" ausgegeben. Also die ersten 9 Elemente im String.

    Nun soll ich das so machen, dass wenn ich n=2 setze nur "es" ausgegeben wird.

    Ich habe mir es so gedacht:

    void right(char source[], int n, char target[])
    {
        int i;
    
        for(i=source['\0']-n; i<=source['\0']; i++)
        {
            printf("%c", source[i]);
        }
    }
    

    also dass i bei i= Ende - n startet und dann bis zum Ende ausgibt. Jedoch bekomme ich als Ausgabe "led for" obwohl die source wieder "Hallo wie geht es" ist.

    Danke für Ihre Bemühungen mir weiterzuhelfen.



  • Das led for steht für:

    runtime failure: VirtualQuery failed for

    es wurde nur led for ausgegeben, weil ich n=6 hatte - es wurde abgeschnitten



  • Du musst erstmal das i für das Stringende finden. (Also das, was strlen macht.)

    Damit kannst du dann weitermachen.



  • source['\0'] ist das Selbe wie source[0]

    Mit i=source['\0'] weist du i den Wert vom ersten Zeichen aus source zu.



  • Außerdem ist

    for(i=0; i<=n; i++)
    

    in Deiner left-Funktion falsch. Es muss

    for(i=0; i<n; i++)
    

    heißen!
    Und wofür ist eigentlich target[] da? Das wird nie benutzt.



  • Blutiger.Anfänger schrieb:

    Hallo,
    ich muss einen String von rechts ausgeben und das ohne vordefinierte Funktionen.

    Das geht nicht! Wie willst Du irgendwas ohne vordefinierte Funktionen ausgeben?



  • DirkB schrieb:

    Du musst erstmal das i für das Stringende finden. (Also das, was strlen macht.)

    Damit kannst du dann weitermachen.

    Das hab ich probiert, aber ist wohl auch was falsch, da ich jetzt nur irgendwelche Zeichen aus der Asci-Tabelle ausgegeben bekomme.

    #include <stdio.h>
    #include <stdlib.h>
    
    int zaehlen(char str[])
    {
        int len = 0;
        while (*str != '\0')
        {
            str++;
            len++;
        }
        return len;
    
    }
    
    void rechts(char source[], int n, char target[])
    {
        int i;
    
        for(i=zaehlen(source)-n; i<zaehlen(source); i++)
        {
            printf("%c", target[i]);
        }
    }
    
    int main()
    {
        char target[20];
    
        rechts("Hallo wie geht es denn", 9, target);
    
    }
    

    @Belli - damit ist gemeint, dass ich keine vordefinierten Fktionen aus string.h wie z.b. strlen nehmen soll.



  • Ahh...
    Es wird!

    Aber moment: jetzt gibst Du in rechts() Zeichen aus target aus, hast aber nie irgendwas da reingeschrieben?!



  • Wie soll ich denn in target was reinschreiben? Auch wenn ich:

    char target[20]="Hallo wie geht es denn";

    mache, kommmen auch nur Zeichen raus



  • Blutiger.Anfänger schrieb:

    Wie soll ich denn in target was reinschreiben?

    Wie Du das machst, musst Du wissen.

    Aber es ist Teil der Aufgabe:

    Blutiger.Anfänger schrieb:

    void right( char source [], int n, char target[] )
    Schneidet die letzten n Zeichen aus dem Quellstring source aus und speichert die Zeichen in dem String target ab.



  • Furble Wurble schrieb:

    Blutiger.Anfänger schrieb:

    Wie soll ich denn in target was reinschreiben?

    Wie Du das machst, musst Du wissen.

    Ich weiss ja nichtmal warum ich, ich nur Ascii-Zeichen und nicht den gewünschten Teil des Strings als Ausgabe bekommme. 😕



  • Blutiger.Anfänger schrieb:

    Furble Wurble schrieb:

    Blutiger.Anfänger schrieb:

    Wie soll ich denn in target was reinschreiben?

    Wie Du das machst, musst Du wissen.

    Ich weiss ja nichtmal warum ich, ich nur Ascii-Zeichen und nicht den gewünschten Teil des Strings als Ausgabe bekommme. 😕

    Momentan gibst Du ein paar Zeichen aus dem Array target aus. Da Du target nirgendwo initialisierst, kommt da Müll.

    Was Dir noch fehlt ist in rechts() die letzten n Zeichen aus source in target zu kopieren.



  • Danke für deine Mühe,
    aber ich sitz am der Aufgabe jetz schon ewig und kriegs einfach nicht mehr auf die Reihe(ka wie ich die n elemente aus source in target bekomme)
    Scheiss drauf, morgen gibts in der Vorlesung eh die Lösung.



  • Blutiger.Anfänger schrieb:

    Danke für deine Mühe,
    aber ich sitz am der Aufgabe jetz schon ewig und kriegs einfach nicht mehr auf die Reihe(ka wie ich die n elemente aus source in target bekomme)

    Nachdem Du mit zaehlen() schon strlen() nachbauen musstest, wirst Du doch ein strcpy() hinbekommen?



  • nein, wie gesagt, ich krieg jetzt gar nichts mehr auf die Reihe, hab das hier in google gefunden:

    void copy_string(char target[], char source[])
    {
       while(*source)
       {
          *target = *source;
          source++;
          target++;
       }
       *target = '\0';
    }
    

    mein problem ist aber, dass ich nicht weiss wie ich es dann in rechts() verwenden soll.



  • Erstmal: don't panic.

    Du weisst, das strings in C eine Menge chars sind, die nacheinander im Speicher stehen. Ist der Wert eines solchen chars '\0' endet der string dort.

    Auf diese '\0' zu prüfen machen z.B. die beiden while Schleifen in zaehlen() und copy_string() .

    Was Du jetzt noch wissen musst, ist das z.B. bei

    void copy_string(char target[], char source[]);
    
    void f(){
      const char *str = "Hallo!";
      char dest[2555];
      copy_string(str, dest);
    }
    

    In copy_string() die beiden Parameter target und source vom Typ "Zeiger auf char" sind. Deswegen kann copy_string() überhaupt so geschrieben werden, wie es geschrieben ist.

    Und zuguterletzt, wenn ich eh Zeiger habe, kann ich auch Zeigerarithmetik betreiben:

    void g(){
      const char src[] = "aaabbb";
      int N = zaehlen(src);
    
      char dest[255];
    
      copy_string(dest, src);
      puts(dest);
    
      copy_string(dest, src+N/2); // hintere Haelfte (Zeigerarithmetik)
      puts(dest);
    }
    

    Im Grunde ist das alles, was Du bisher in der Vorlesung gelernt haben musst, um die Aufgabe lösen zu können.
    (Eigentlich reicht auch viel weniger. Aber das sind die Basics, die Du verstanden haben musst um sowohl zaehlen() , als auch copy_string() zu raffen.)


Anmelden zum Antworten