Ganze Gleichungen eingeben



  • Hey Community, hab da eine reine Interessensfrage.

    Nämlich habe ich grade ein Programm zum Addieren und Multiplizieren von Vektoren programmiert. Das Programm läuft wunderbar. Mir geht's bei meiner Frage aber um die Tastatureingabe.

    Derzeit sieht die so aus:

    printf("Please give two vectors (and addition or multiplication operator) in following format: (x1|y1|z1), (x2|y2|z2), operator\n\n");
    
    scanf_s("(%d|%d|%d), (%d|%d|%d), %c", &v1[0], &v1[1], &v1[2], &v2[0], &v2[1], &v2[2], &op);
    

    So sieht ein Beispiel auf der Konsole aus:
    Please give two vectors (and plus or times) in following format:
    (x1|y1|z1), (x2|y2|z2), operator

    (1|2|3), (1|2|3), +

    Die Eingabe ist hier in Postfix ("Vektor1, Vektor2, Operator").

    Ich würde die Eingabe aber lieber in Infix, also "Vektor1 Operator Vektor2", schreiben wollen, weil es intuitiver bei der Eingabe ist. Beim bloßen austauschen der Position des Operators kommt dann aber eine Exception "Zugriffsverletzung beim Schreiben an Position".

    Wenn ich im Internet suche, finde ich aber immer nur ganz anfängliche Tutorials, wie man scanf(_s) nutzt. Kann mir jemand ein Lösungsvorschlag oder einen Link geben, wo ich etwas mehr über die Funktion erfahre?



  • @andy scanf_s ist nicht scanf
    Bei einigen Formatspecifiern werden zusätzliche Parameter benötigt.

    Es wäre auch ganz praktisch, wenn du auch deinen Versuch mit Infix posten würdest. Dann kann man sagen, was daran falsch ist.



  • scanf_s ist Quatsch, deine Trennzeichen bei fester Anzahl von Eingabewerten ebenso überflüssig, wichtig wäre die Auswertung einer korrekten Eingabe mittels Returnwert, in etwa so:

    if( 7==scanf("%d%d%d %c%d%d%d",v1,v1+1,v1+2,&op,v2,v2+1,v2+2) )
    


  • Danke für die bisherigen Antworten und erstmal dickes Sorry wegen langer Abwesenheit. Genau ein Tag nach meinem Beitrag in meine Festplatte abgeraucht. Danach hab ich es voll vergessen ^^'.

    Daher ist natürlich auch mein Quellcode weg.
    Wenn ich mich recht erinnere, hatte ich einfach nur die Positionen getauscht:

    scanf_s("(%d|%d|%d), %c, (%d|%d|%d)", &v1[0], &v1[1], &v1[2], &op, &v2[0], &v2[1], &v2[2]);
    

    (rekonstruiert mit Erinnerung und den hier angegebenen Quellcode)

    Wegen scanf_s:
    Bei mir hat stets der Compiler gemeckert, wenn ich nur scanf geschrieben habe. Er hat mir stattdessen scanf_s empfohlen. Muss aber zugeben, dass ich nicht genau weiß, woran das lag/liegt.



  • @andy scanf ist, wenn man es falsch benutzt, unsicher.
    scanf_s ist da sicherer, weil man z.B. bei %s und %c die Größe des dazugehörigen Speichers mit angeben muss.
    (wenn ich mich recht erinnere, werden auch noch Überprüfungen auf NULL gemacht)

    Es ist dadurch aber kein 1:1 Ersatz.

    Darum immer: RTFM

    Allerdings sollte der Compiler auch da eine Warnung ausgeben, wenn die PArameter nicht passen.
    Bei scanf und printf kann er es.

    Man kann Visual Studio auch dazu bekommen dieses blöde Gemeckere abzustellen.
    irgendwas mit #pragma



  • @DirkB Ich hatte eure Beiträge zum Anlass genommen, einen Unterschied heraus zu arbeiten mithilfe unterschiedlicher Websites und PDFs zwischen scanf und scanf_s. Hab bisher keine Manual gefunden, die mir einen deutlichen Unterschied aufzeigt, außer eben die Sache mit Buffer-Overflow-Security, (zumindest online). Falls du eine kennst, würde ich mich freuen, wenn du mir diese nennen könntest.

    Hab allerdings eine vielversprechende Seite gefunden. Die schau ich mir die Tage nochmal genauer an.



  • @andy suche mal msdn scanf_s

    Das ist die Seite von Microsoft