Eingabe - Ausgabe Textumwandlung



  • Hallo C-plusplus Community,

    Ich habe noch frisch mit C(++) angefangen und 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 und Ansich funktioniert das auch:

    char test[100];
    char needle[] = "123";
    char needle2[] = "456";
    
    int _tmain(int argc, _TCHAR* argv[])
    {	
    	SetConsoleTitle(_T("Hrmpf"));
    
    while(true)
    {
    	gets(test);
    
    	if(strstr(test, needle)) 
    	{
    		printf("abc");
    	}
    
    	if(strstr(test, needle2)) 
    	{
    		printf("def");
    	}
    
    }
    	return 0;
    }
    

    nur gibt er mir halt IMMER abcdef raus auch wenn ich 456123 Eingebe, weil strstr dann eben zuerst von hinten einließt, so wie kann ich nun in der KORREKTEN Reihenfolge übersetzten lassen ?? 😕 denn so macht das leider wenig Sinn,

    Vielen Dank



  • Was hast du vor 😕

    Willst die Probleme von:

    gets();
    

    testen?
    Hier steht etwas von Danger:
    http://msdn.microsoft.com/en-us/library/2029ea5f(v=vs.71).aspx

    eventuell wird dein Quelltext mehr so wie du dir das vorstellst, wenn du statt:

    strstr(...
    

    folgendes einsetzt

    strncmp (...
    

    musst halt nur die Länge passend wählen

    MfG f.-th.



  • Ah, thx für den Hinweis auf gets, das war mir neu

    Mit strncmp komm ich leider auch nicht weiter, ich möchte einen längeren Text eingeben und mir den dann "Umgewandelt" wieder ausgeben, jetzt ist das Problem das er beispielsweise Alle oder einige chars findet, und sie in der Angelegten Reihenfolge des Programms ausgibt, und nicht in der Reihenfolge des Eingabetextes so gibt mir die Console immer abcdef... aus, auch wenn needle2[] die erste Eingabe war.



  • 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