Brauche Hilfe, bin C-Neuling!!!



  • Gut, werd ich machen, wird aber wahrscheinlich ein bisschen dauern bis ich das fertig hab, so schnell bin ich noch nicht.... 😃 !
    Naja, bei den Foren geb ich Dir Recht, ich wurde bei einem nicht beachtet und in zwei aderen für meine "Blödheit" angemacht und ausgelacht...ist dann immer sehr aufbauend ein Forum zu finden wo die Leute so nett sind! Also für euch auf jeden Fall: 👍 !!!
    Gruß emi



  • mcr schrieb:

    @elise: der return code von sscanf gibt die Anzahl der matchenden Eingaben
    an, nicht den Wert von c.

    darüber habe ich keine aussage gemacht. ich bin im übrigen mehr für tricks und weniger für switch case 😉

    ps: @ska_emily .. wie wärs, einfach mal das "dumme" von studentin in deiner mitgliedsbeschreibung wegzunehmen.. dumm ist der, der dummes tut. (Forrest Gump), und benne deine thread titel 'ordentlich' (hilfe brauchen immer alle *g*) 😉



  • C.Stoll schrieb:

    ...gibt es nach Emilys Vorgabe nur einen Eingabeparameter, der ausgewertet werden soll...

    Hmm, ist mir irgendwie entgangen... So richtig kann ich das auch nicht rauslesen. Und um die zusätzliche Möglichkeit (mit Schleife) ist sie mir bestimmt nicht böse.

    C.Stoll schrieb:

    Was soll der Vergleich if(TempInput!=c) eigentlich bewirken? Du vergleichst die Eingabe mit einem nicht initialisierten Wert.

    Fein aufgepasst! Da habe ich doch glatt die Initialisierung vergessen.
    Also Emily: Nach der Deklaration und vor der Verwendung das TempInput bitte noch mit 0 initialiseren. 😉
    Was das bewirken soll? Wenn keine Eingabe gemacht wird, wird die Schleife ja weiter durchlaufen, immer wieder. Damit dann nicht jedes Mal die Fehlermeldung kommt, wird geprüft, ob es noch der alte Eingabewert ist.

    C.Stoll schrieb:

    scanf(argv[1],"%c",&c); nimmt das erste Argument des Programms als Formatkennung (das könnte noch brauchbar sein) - und versucht, in ein String-Literal zu schreiben (BUMM)

    Hmmm...

    ich schrieb:

    Ich übernehme keine Garantie für Richtigkeit, bitte verbessert mich! Ich hoffe das dient der weiteren Anregung. 🙂

    @C.Stoll:
    Danke für Deine Verbesserungen. Es würde aber noch besser helfen, wenn sich das nicht immer so anklagend "anhören"/ lesen würde, wenn Du Verbesserungsvorschläge hast. 😞 Weiterhin würde es SEHR helfen, wenn Du (zB auch für Emily) die Lösung Deiner Kritikpunkte posten würdest. 😉



  • was ich mich grad frag, is des...
    wäre es net deutlich einfacher zu prüfen:

    if(c >='0' && c <= '3')
    

    und dann haste irgendwie n zweidimensionales array deklariert, in dem die bilder drin stehn (soweit ich weiß solln des ja so sterne, oder rautenbilder sein) und du gibst es einfach dann mit

    printf("%s\n", array[atoi(c)]);
    

    aus?
    wenn de die bilder sowieso irgendwo definierst, find ich des eigentlich ganz praktisch, haste dann auf 2 zeilen alles gemacht oder so



  • Die Lösung steht doch schon oben in mcr's Beitrag (eine Schleife ist nicht wirklich notwendig, um einen einzelnen Wert von der Kommandozeile zu holen - zumal du in jedem Durchlauf mit den selben Werten arbeiten würdest und demzufolge auch die selben Ergebnisse bekommst (Endlosschleife).



  • Also, Arrays sind bestandteile der nächsten Aufgabe, bin ich zumindest der Meinung, noch hab ich sie nicht, die Ausgabe soll wirklich nur über printf mit Zeilenumbrüchen gemacht werden. Das hab ich soweit noch verstnden gehabt, wie das funzt, ich hatte nur Probleme mit diesen Vorgaben von dem Übungsleiter...Aber ich glaub ich versteh das jetzt. Sonst schreib ich noch mal und heul euch vor, das es nicht funzt 😃 !
    Noch mal vielen Dank, cu emi!



  • @ska_emily: Schau mal, elise hat einen Post nochmal editiert... Und ich bin auch der Meinung! 😉

    @C.Stoll:

    C.Stoll schrieb:

    Die Lösung steht doch schon oben in mcr's Beitrag (eine Schleife ist nicht wirklich notwendig, um einen einzelnen Wert von der Kommandozeile zu holen ...

    Ich weiß nicht, wie ich es noch ausdrücken soll: Wenn meine Freundin eine Sitzheizung in Ihr Auto haben will und ich baue eine regelbare Sitzheizung ein - dann ist das zwar mehr als gewollt, aber nicht verkehrt. Nun hab Dich nicht so und vergiß die Schleife, wenn Sie DIR zuviel ist. Ich fände es nervig ein Programm zu testen, welches ich immer wieder neu starten müsste - auch ein Grund für ne Schleife! 😉

    C.Stoll schrieb:

    ...zumal du in jedem Durchlauf mit den selben Werten arbeiten würdest und demzufolge auch die selben Ergebnisse bekommst (Endlosschleife).

    Endlosschleife mit Abbruch durch Taste "q"... So war das gedacht - nur das die Zeichenabfrage (wie andere Kleinigkeiten) nicht so glücklich war. Ich habe jedoch inzwischen schon 2x darauf hingewiesen, dass mein Beispiel zur ANREGUNG ist, KEINEN Anspruch auf Richtigkeit erhebt und Verbesserungen nötig sein könnten. Was willst Du erreichen mit Deiner Stocherei in diesen Kleinigkeiten?

    Wenn es beruhigt:
    @ alle Leser: die Prüfung

    if(TempInput != c)
    

    muss die switch-Anweisung einschliessen! ⚠



  • Kolumbus schrieb:

    @ska_emily: Schau mal, elise hat einen Post nochmal editiert... Und ich bin auch der Meinung! 😉

    @C.Stoll:

    C.Stoll schrieb:

    Die Lösung steht doch schon oben in mcr's Beitrag (eine Schleife ist nicht wirklich notwendig, um einen einzelnen Wert von der Kommandozeile zu holen ...

    Ich weiß nicht, wie ich es noch ausdrücken soll: Wenn meine Freundin eine Sitzheizung in Ihr Auto haben will und ich baue eine regelbare Sitzheizung ein - dann ist das zwar mehr als gewollt, aber nicht verkehrt. Nun hab Dich nicht so und vergiß die Schleife, wenn Sie DIR zuviel ist. Ich fände es nervig ein Programm zu testen, welches ich immer wieder neu starten müsste - auch ein Grund für ne Schleife! 😉

    Ja, ich hab' nichts dagegen, in einem Programm mehrere Eingaben nacheinander bearbeiten zu können. Aber hier ging (auch) es um die Verarbeitung der Kommandozeilen-Argumente - und da ist es etwas ungeschickt, immer den selben abzufragen 😉



  • Hallöle!
    Ich hab da jetzt nochein Problem, durch das ich nicht durchsteige: es funzt soweit, wenn man allerdings 1.2 oder sowas eingibt sieht er das als 1 und zeigt mir das passende Bild!
    Weiß jemand, wie man sowas abfagen kann?
    gruß emi



  • Würd es nicht reichen das du abfragst ob die (Eingabe ==0,1,2,3,4)
    --> dann tue das
    --> andernfalls Fehlermeldung!!



  • Irgendwie hatte ich n Brett vorm Kopf... Kommandozeile-Argumente war das Stichwort 🙄 Also ich seh's dann doch ein @C.Stoll.
    Ich war die ganze Zeit drauf aus, dass es um Tastatureingaben geht wenn das Programm schon läuft. Peinlich! 🕶

    Edit: PS @ska_emily: Geht doch mit der Berufsbezeichnung 😉



  • ska_emily schrieb:

    Hallöle!
    Ich hab da jetzt nochein Problem, durch das ich nicht durchsteige: es funzt soweit, wenn man allerdings 1.2 oder sowas eingibt sieht er das als 1 und zeigt mir das passende Bild!

    Der Code mit dem sscanf() liest ja auch nur das erste Zeichen des Eingabeparameters (wobei ich immer noch der Meinung bin, daß ein c=argv[1][0]; da völlig ausreichen würde). Wenn du überprüfen willst, ob das alleine steht, mußt du die Stringlänge überprüfen oder das zweite Zeichen mit '\0' vergleichen.



  • Guten Morgen,

    was mir gerade noch einfiel: Für viele Programme die man in grauer Vorzeit ja fast immer über die "Kommandozeile" gestartet hat, gab es Regeln für die Kommandozeilenparameter eines Programms. Diese waren dann irgendwo nachzulesen (helpfile etc).
    @ska_emily: es wäre gut, wenn Du mal VollständiG postest welche Kommandozeilenparameter für Dein Program erlaubt sein sollen und welche "abartig eingegebenen" zusätzlich erkannt werden sollen.
    Sowas wie zB: "-1" "-2" "-3" "-4" ist erlaubt, "1.2.3.4.5" soll auch erkannt werden und Bild 1 - 4 nacheinander ausgeben, sowie für die 5 eine Fehlermeldung ausgeben...



  • ska_emily schrieb:

    Weiß jemand, wie man sowas abfagen kann?

    wie CStoll schon gesagt hat: das zweite Zeichen von argv[1] mit '\0' vergleichen, dass das stringende markiert. is zwar für den zweck etwas übertrieben aber man könnte aus auch so machen:

    ...
    if (argc!=2 || strlen(argv[1])!=1 ) // prüft ob in argv[1] mehr als ein zeichen steht
    {
       fprintf(stderr, "(E) Falscher Aufruf\n");
       fprintf(stderr, "Use: %s [0..3]\n", argv[0]);        
       return 1;
    }
    

    wobei ich grad überlegen muss: wenn argc!=2 dann wird strlen(...) trotzdem abgefragt... gibt das irgend ne speicherverletzung, ich meine man liest ja in "fremdem" speicher.



  • santa klaus schrieb:

    wobei ich grad überlegen muss: wenn argc!=2 dann wird strlen(...) trotzdem abgefragt... gibt das irgend ne speicherverletzung, ich meine man liest ja in "fremdem" speicher.

    Du hast Glück - die C Logikoperatoren haben eine eingebaute "Kurzschluss-Automatik", d.h. wenn der erste Operand von || schon wahr (bzw. der erste Operand von && falsch) ist, wird der zweite gar nicht mehr ausgewertet, weil das Ergebnis ja schon feststeht. Darum sind in C auch Abfragen ala if(str!=NULL && irgendeine Bedingung zu str)... üblich.


Anmelden zum Antworten