Brauche Hilfe, bin C-Neuling!!!
-
Hallöchen!
So, Ihr seid meine letzte Hoffnung...! Ich bin absolute C-Analphabetin
und hoffe, dass jemand mir helfen kann.
Also: Wir sollen eine Aufgabe machen, in der Bilder ausgegeben werden sollen (so wie bei diesem 'Hello World'- Beitrag). Wie man die ausgibt versteh ich ja noch, allerdings hat der Übungsleiter uns ein Muster vorgegeben, mit dem wir das machen sollen und mit dem ich nicht klar komme:if (argc!=2){
fprintf(stderr, "Fehler!")
return 1;
}else{
if (1==sscanf(argv[1], "%c", &c)){
...
}else{
#Fehler'}
return 0;}--> also, um das weiter zu erläutern, es gibt vier Bilder und wir sollen Fehler wie eine Eingabe eines Buchstaben oder einer Zahl kleiner 0 oder größer 4 abfangen.
Ich hoffe da steigt jemand durch und kann mir das mal erklären, was mit dem kram wohl gemeint sein kann....
Auf jeden Fal schon mal Dank an jeden, der das liest(und das Programm bestimmt al einfach empfindet) und ich würde mich über Rat oder auch Tipps ser freuen!
cu emi
-
bei sscanf(argv[1], "%c", &c) wird ein buchstabe, also typ char abgeholt.
wenn du es mit integer 1 vergleichst, wird nix draus.
du musst mit '1' vergleichen.darüber hinaus: eine nette idee, <0 und >4 zu produzieren, wäre einfach, die eingabe (ein char) minus '0' zu nehmen (schau mal in der asci tabelle nach, was das eigentlich intern für eine zahl ist, denn '0' ist nicht gleich 0), um zu sehen, was da wirklich rauskommt.
-
Hallo Emi,
hier habe ich dir mal eine mögliche Lösung gepostet.
@elise: der return code von sscanf gibt die Anzahl der matchenden Eingaben
an, nicht den Wert von c.mit
sscanf(argv[1], "%c", &x);
liest du ein Charakter aus dem String argv[1]. Da du die Anzahl der
übergebenen Paramter abgefangen hast, sollte sscanf nie einen anderen
Wert ausser 1 hier zurückgeben.#include <stdio.h> #include <stdlib.h> int main(int argc, char *argv[]) { char c; if (argc!=2) { fprintf(stderr, "(E) Falscher Aufruf\n"); fprintf(stderr, "Use: %s [0..3]\n", argv[0]); return 1; } if (sscanf(argv[1], "%c", &c) == 1) { switch(c) { case '0': case '1': case '2': case '3': printf("Korrekter input: %c\n", c); break; default: fprintf(stderr, "(E) Fehlerhafter input: %c\n", c); return 1; break; } } else { fprintf(stderr, "(E) Fehler, ich weiss zwar nicht, wie ich hier reinkomme, aber gut\n"); return 1; } return 0; }
Was switch macht, kannst du in jedem C-Buch nachlesen.
Gruß mcr
-
Ich schließe mich an. Ich hätte das auch mit einer switch-Anweisung gelöst. Wenn Du das Program selbst abbrechen willst (zB. per Taste Q oder C) kannst Du es in eine Schleife legen, deren Abbruchbedingung die entsprechende Taste ist. Das Programm von mcr bricht momentan nach jeder Aktion ab (gewollt). So in der Art würde das mit einer Schleife aussehen (ich nehme einfach mal Dein Programm mcr):
// Schreibst Du vor eine Zeile "//" oder Text zwischen "/*" und "*/" gilt die Zeile / der Text als Kommentar // und wird nicht vom Programm ausgeführt (wird vom Compiler ignoriert ;-) ) #include <stdio.h> #include <stdlib.h> int main(int argc, char *argv[]) { char c; if (argc != 2) { fprintf(stderr, "(E) Falscher Aufruf\n"); fprintf(stderr, "Use: %s [0..3]\n", argv[0]); // return 1; <= das brauchen wir nur noch 1x, wenn die Schleife beendet wurde } while(argv[1] != 'q') // <= while-Schleife; prüft vor Durchlauf, ob "q" eingegeben wurde { char TempInput; scanf(argv[1], "%c", &c); switch(c) { case '0': /* hier musst Du die jeweilige Bildausgabe einfügen */ case '1': /* ----||---- */ case '2': /* ----||---- */ case '3': /* PS: denk ans "break" - siehe switch in C-Büchern */ printf("Korrekter input: %c\n", c); break; // <= diese Zeile nur, // wenn ausser dem Bild noch eine Bestätigung über die korrekte Eingabe erscheinen soll default: if(TempInput != c) { fprintf(stderr, "(E) Fehlerhafter input: %c\n", c); TempInput= c; } // return 1; // break; <= wozu wird das benötigt @mcr? } } return 0; }
Ich übernehme keine Garantie für Richtigkeit, bitte verbessert mich! Ich hoffe das dient der weiteren Anregung.
-
Das hilft mir auf jeden Fall sehr weiter, danke, danke!
Ich hoffe es klappt dann so wie ich mir das jetzt vorstelle!
Schönen Tag euch noch, cu emiP.S. Ic hoffe ich nerve euch nicht, falls ich noch ein mal so eine Frage stelle!?
-
@Kolumbus: Bevor du deine Lösungen auf die Menschheit loslässt, solltest du sie wenigstens überblicksweise kontrollieren:
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)- Was soll der Vergleich
if(TempInput!=c)
eigentlich bewirken? Du vergleichst die Eingabe mit einem nicht initialisierten Wert. - Außerdem gibt es nach Emilys Vorgabe nur einen Eingabeparameter, der ausgewertet werden soll - also ist eine Schleife etwas übertrieben
@Emily: Um einen einzelnen char aus einem String auszulesen, brauchst du kein sscanf() - dafür gibt's Index-Operatoren (c=argv[1][0]).
-
Einige Foriker sind zwar schnell genervt, aber das muss Dir keine Sorgen machen. Wichtig ist: Es sollte deutlich erkennbar sein, dass Du dich mit dem Thema zu dem Du fragst schon selbstständig beschäftigt hast.
Zeig vielleicht mal Dein fertiges Programm, wenn's soweit ist. Und schau morgen nochmal hier rein, oft kommen noch Nachbesserungen oder Einwände von anderen Forikern.
-
Edit: Huch, Doppelpost... Und dann noch ein Beitrag von Herrn Stoll... Ich prüfe...
-
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üfungif(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.