Eingabe - Ausgabe Textumwandlung



  • Du musst das anders machen, ungefähr so:

    ein Array mit dem was eingegeben werden kann:

    char *suchtext = "123456";

    und ein Array mit dem, was dann ausgegeben werden soll:

    char *zieltext = "abcdef";

    nun suchst Du jedes eingegebene Zeichen in dem ersten Array, und greifst mit dem gefundenen Index in das zweite Array, um das dazugehörige Zeichen auszugeben.
    Wird ein eingegebenes Zeichen im ersten Array nicht gefunden, gibt es keine dazugehörige Übersetzung.



  • Also etwa:

    #include <stdio.h>
    #include <string.h>
    
    char needle[] = "123456";
    char needle2[] = "abcdef";
    
    void translate(char *in)
    {
    	char *ptr;
    
    	while(*in)
    	{
    		ptr = strchr(needle,  *in);
    		if(ptr)
    			putchar(needle2[ptr - needle]);
    		else
    			printf("%c nicht gefunden\n", *in);
    
    		++in;
    	}
    }
    
    int main()
    {   
    	char test[100];
    
    	while(1)
    	{
    	    gets(test);
    
    	    translate(test);
    	    putchar('\n');
    
    	}
        return 0;
    }
    


  • Belli schrieb:

    Du musst das anders machen, ungefähr so ..

    Wenn ich die Aufgabenstellung richtig verstanden habe wäre das aber
    nicht die Lösung für diese Aufgabe, oder ?

    Die könnte möglicherweise etwas so aussehen:

    char *sx, *sa, *sb;
    
    while(true) {
    
    	fgets(test, MAXSTRLEN, stdin); 
    
    	sa = strstr(test,  needle);
    	sb = strstr(test, needle2);
    	sx= test;
    
    	for(sx=test; strlen(sx)>0; ) {
    		if(sx == sa) { 
    			printf("abc"); sx+=3;
    			}
    		else if (sx== sb) { 
    			printf("def"); sx+=3;
    			}
    		else {
    			printf("%c", *sx);
    			sx++;
    			}
    	}
    }
    


  • Mhm, die Aufgabe lautet doch:

    ... möchte mir einfach einen Eingabetext übersetzten lassen, zum Beispiel gebe ich 123456 ein, gibt er mir abcdef aus, (123=abc und 456=def) und bei der Eingabe 456123, die Ausgabe defabc ...

    Hast Du Deinen Vorschlag eigentlich mal getestet?



  • Soll Zeichen für Zeichen übersetzt werden?
    Dann hier etwas schnell gehacktes:

    #include<stdio.h>
    #include<string.h>
    
    int main(int argc, char* argv[])
    {
        char test[100];
        int strl;
    
        fgets(test, 99, stdin);
    
        strl = strlen(test);
        for(int i = 0; i < (strl - 1); i++)
            printf("%c\n", test[i] - '1' + 'a');  // '1' = 'eins'
    }
    

    Das geht sicher noch kürzer.

    Wenn allerdings Zeichenblock für Zeichenblock übersetzt werden soll, brauchst du mehr.



  • Belli schrieb:

    Hast Du Deinen Vorschlag eigentlich mal getestet?

    Wieso ?

    (natürlich 😉



  • f.-th. schrieb:

    Das geht sicher noch kürzer.

    Ja, wenn man c++ mit string-klasse verwendet.

    f.-th. schrieb:

    Wenn allerdings Zeichenblock für Zeichenblock übersetzt werden soll, brauchst du mehr.

    Davon war ich ausgegangen.



  • merano schrieb:

    Belli schrieb:

    Hast Du Deinen Vorschlag eigentlich mal getestet?

    Wieso ?

    Weil ich nicht glaube, dass hier

    if(sx == sa)
    

    das passiert, was Du möchtest.



  • Belli schrieb:

    Weil ich nicht glaube, dass hier

    if(sx == sa)
    

    das passiert, was Du möchtest.

    Natürlich. Was soll an dem Ansinnen zwei Adressen auf Gleichheit zu prüfen bedenklich sein ?

    Allerdings könnte man den Entwurf noch flexibler machen, wenn man

    sa = strstr(sx, needle );
    sb = strstr(sx, needle2);
    

    in die Schleife verlegt, damit auch mehrfach auftretende Stellen verarbeitet
    werden. Damit kann sich der Fragesteller aber selbst beschäftigen. Das Gerüst
    ist ja vorhanden.



  • merano schrieb:

    Belli schrieb:

    Weil ich nicht glaube, dass hier

    if(sx == sa)
    

    das passiert, was Du möchtest.

    Natürlich. Was soll an dem Ansinnen zwei Adressen auf Gleichheit zu prüfen bedenklich sein ?

    Da ist nix Bedenkliches dran. Ich habe aber strcmp stattdessen erwartet. Bei nochmaligem Hinschauen habe ich jetzt aber gesehen, dass beide Zeiger in denselben String zeigen, deswegen nehme ich alles zurück und behaupte das Gegenteil.
    Dies bezieht sich allerdings nicht darauf, dass ich die Aufgabenstellung anders interpretiere.


Anmelden zum Antworten