Frage zu Strings...
-
wenn ich debugger das Programm öffne, dann kann ich, wenn der Debugger beim ersten getchar stehen bleibt, den ganzen Satz eingeben... Deshalb bin ich darauf gekommen...
-
bandchef schrieb:
wenn ich debugger das Programm öffne, dann kann ich, wenn der Debugger beim ersten getchar stehen bleibt, den ganzen Satz eingeben... Deshalb bin ich darauf gekommen...
Der Rest liegt dann im Puffer und wird letztendlich auch Zeichen für Zeichen eingelesen.
Fazit: getchar liest nur ein einzelnes Zeichen, deshalb heißt die Funktion auch getchar und nicht getchars.
#include<stdio.h> // Eingabe und Ausgabe #include<ctype.h> #define NMAX 100 // Ermöglicht einfache Änderung der Puffergröße int main() { char zeile[NMAX], c; // Array für Satz, einzelnes zeichen int i; // Laufvariabel i = 0; // Initialisierung c = getchar(); // erstes Zeichen einlesen while(c != '\n') // Bis Enter gedrückt (=> Enter löst \n aus) { zeile[i] = c; // Zeichen in Array setzen i = i + 1; // Laufvariabel erhöhen c = getchar(); // nächstes Zeichen einlesen } zeile[i] = '\0'; // Ende des Strings markieren printf("%s", zeile); // Ausgabe return 0; // Programm mit Fehlercode 0 (= Kein Fehler) beenden }
-
fazit: "quasi" macht den satz eh schon falsch...
-
Hab mittlerweile verstanden wie das obige funktioniert. Jetzt hab ich noch eine Frage. Folgendes Programm:
#include<stdio.h> #include<ctype.h> #include<string.h> #define NMAX 100 int main() { char liste[NMAX], c; int vergleichszahl, len, i; vergleichszahl = 0; printf("Vergleichszahl eingeben: "); scanf("%i", &vergleichszahl); printf("Zahlen eingeben: "); i = 0; c = getchar(); while(c != '\n') { liste[i] = c; i = i + 1; c = getchar(); } liste[i] = '\0'; len = strlen(liste); return 0; }
Ich hab da jetzt das Problem, dass er mir ohne einen Tastendruck ein "\n" in c speichert, was zum sofortigen Erfüllen der while-Bedingun führt und ich keine Werte in die liste[] eingeben kann.
-
Du mußt einmal das '\n' aus der scanf - Instruktion 'weglesen'.
Also vor der Schleife zweimal getchar aufrufen.
-
Alternativ kannst Du Dein scanf so ändern:
scanf("%i%c", &vergleichszahl, &c);
Dann wird die Eingabetaste gleich mit dem scanf weggelesen, der Inputstream ist wieder leer, und Du brauchst in der Folge nur ein getchar vor der Schleife wie in Deinem ersten Versuch.
-
Wie kann man ein Programm schreiben, dass Zahlen vom Benutzer entgegennimmt und in ein array speichert? Da häng ich grad irgendwie... Mit nem String hat man ja das Problem, dass man nur die ASCII-Werte drinstehen hat. Ich möchte, aber dass der Benutzer auch mehr stellige Zahlen eingeben kann. Wie kann man das machen?
EDIT: Hintergrund der Frage ist folgende Aufgabenstellung:
Für eine ganze Zahl ist zu prüfen , wie of sie in einer Liste von maximal 100 Zahlen vorkommt und an welchen Stellen sie vor kommt.
Ich glaub nicht, dass da nur einstellige ganze Zahlen gemeint sind.
Kannst du mir weiterhelfen?
-
Hast doch schon gut angefangen. Ich hab's mal ein bißchen abgeändert:
#include<stdio.h> #include<ctype.h> #include<string.h> #define NMAX 100 int main() { int liste[NMAX]; int vergleichszahl, i, zahl, x; vergleichszahl = 0; printf("Vergleichszahl eingeben: "); scanf("%i", &vergleichszahl); printf("Zahlen eingeben: "); i = 0; //getchar(); scanf("%i", &zahl); while(zahl != -1) { liste[i] = zahl; i = i + 1; scanf("%i", &zahl); } printf("\nVergleichszahl: %d\n", vergleichszahl); for(x = 0; x < i; ++x) printf("Liste[%i] = %i\n", x, liste[x]); return 0; }
-
Du mußt natürlich noch auf folgendes achten:
Man darf nicht mehr als NMAX Werte eingeben können, sonst schreibst Du hinter Dein Array, das darf nicht passieren.
Falls -1 und alle anderen ganzen Zahlen mögliche gültige Werte sind, brauchst Du eine andere Abbruchbedingung.Und nun mach mal ein bißchen was selbst!
-
Also ich hab hier jetzt mal mein Programm fertig gemacht. Ich habs mit Strings gemacht. Die "Ziffern" in diesem String rechne ich in echte Zahlen um.
#include<stdio.h> #include<ctype.h> #include<string.h> #define NMAX 100 int main() { char liste[NMAX], c; int array[NMAX], zaehler, stelle[NMAX]; int vergleichszahl, len, i, j; printf("Zahlen eingeben: "); i = 0; c = getchar(); while(c != '\n') { liste[i] = (c - 48); i = i + 1; c = getchar(); } liste[i] = '\0'; len = strlen(liste); vergleichszahl = 0; printf("Vergleichszahl eingeben: "); scanf("%i", &vergleichszahl); j = 0; zaehler = 0; for(i=0; i<len; i=i+1) { array[i] = liste[i]; if(array[i] == vergleichszahl) { zaehler = zaehler + 1; stelle[j] = (i + 1); j = j + 1; } } stelle[j] = '\0'; printf("Es gibt %i gleiche Zahlen!\n\n", zaehler); printf("Die Stellen sind: "); i = 0; while(stelle[i] != '\0') { printf("%i", stelle[i]); i = i + 1; } return 0; }
Das Problem dabei ist halt immer noch, dass ich nur einstellige Zahlen eingeben kann. Wie aber soll man dann mehrstellige Zahlen von anderen Zahlen unterscheiden? Da müsste man ja dann Kommas setzen, welche dann wieder erkannt werden müssten, oder?
-
Ich hab jetzt noch folgende Aufgabe:
Die kleinste Zahl einer Liste von n Zahlen findet man durch folgenden Algorithmus:
Bahupte, die erste Zahl sei die kleinste Zahl. Für die restlichen Zahlen (2,3,...,n) führe aus Falls die Zahlkleiner ist als die derzeit kleinste Zahl dann ist diese Zahl die neue kleinste Zahl.
Schreiben Sie ein Programm zu diesem Algorithmus. Stellen Sie zusätzlich fest, welche Position (Vektorindex) die kleinste Zahl hat.
Mein Code:
#include<stdio.h> #include<ctype.h> #include<string.h> #define NMAX 100 int main() { int i, c, kleinste_zahl, hilfs_var, j; char liste[NMAX]; i = 0; c = getchar(); while(c != '\n') { liste[i] = c; i = i + 1; c = getchar(); } kleinste_zahl = liste[0]; for(j=0; j<i; j=j+1) { if(kleinste_zahl > liste[j]) { hilfs_var = liste[j]; liste[j] = kleinste_zahl; kleinste_zahl = hilfs_var; } } printf("Position = %i, kleinste Zahl = %i", j, (kleinste_zahl-48)); return 0; }
Das Problem an meinem Code ist wahrschinlich wieder, dass ich keine mehrstelligen Zahlen eingeben kann. ABER: Ist das laut Aufgabe überhaupt gefordert? Aber man soll doch Programme immer so allgemein wie möglich halten; das stimmt doch, oder?
-
wieso ein char array?
dadurch werden die chars für den vergleich nach int gecasted und die ASCII repräsentation wird verglichen.
sicher nicht was du wolltest
-
Hm, das ist immer eigentlich noch das gleiche Problem wie gestern Abend. Ich weiß nicht, wie ich in C eine Benutzereingabe programmiere, die dem Benutzer erlaubt ein int array mit int-Zahlen zu belegen; getrennt z.B. durch Leerzeichen. Folgende Eingabe soll es verdeutlichen:
Der Benutzer gibt genau das in die Konsole ein:
12 32 45 56 78 89 123 456 789 -> [ENTER]
Im Array soll dann folgendes stehen:
----------------------------------------------------------------------------- | 12|032| 32|032| 45|032| 56|032| 78|032| 89|032|123|032|456|032|789|032|010| -----------------------------------------------------------------------------
Irgendwie verstehe ich das aber trotzdem nicht. Denn wie soll man denn nun z.B. die ASCII-Zahl "32" für das Leerzeichen von der Zahl 32 die an der zweiten Stelle im Array steht unterscheiden können?
-
bandchef schrieb:
Hm, das ist immer eigentlich noch das gleiche Problem wie gestern Abend. Ich weiß nicht, wie ich in C eine Benutzereingabe programmiere, die dem Benutzer erlaubt ein int array mit int-Zahlen zu belegen; getrennt z.B. durch Leerzeichen. Folgende Eingabe soll es verdeutlichen:
Der Benutzer gibt genau das in die Konsole ein:
12 32 45 56 78 89 123 456 789 -> [ENTER]
Ich hab Dir doch gestern abend einen funktionierenden Quellcode dafür gepostet ...
-
Du meinst den hier?
i = 0; //getchar(); scanf("%i", &zahl); while(zahl != -1) { liste[i] = zahl; i = i + 1; scanf("%i", &zahl); }
-
Gut, das stimmt...
Die Abbruchbedingung der Schleife ist aber doch eine -1. Das heißt, damit ich aus der while-Schleife rauskomm, müsste der Benutzer eine -1 reinschreiben. Das ist aber doch auch nicht Sinn der Sache, oder?
-
Ich will mir in meinem Programm die Stelle im Array merken an der die kleinste Zahl gesessen hat.
Mein Code:
#include<stdio.h> #include<ctype.h> #include<string.h> #define NMAX 100 int main() { int zahl, liste[NMAX]; int i, j, k, t, kleinste_zahl, hilfs_var, zaehler; i = 0; scanf("%i", &zahl); while(zahl != -1) { liste[i] = zahl; i = i + 1; scanf("%i", &zahl); } kleinste_zahl = liste[0]; k = 1; zaehler = 0; for(j=k; j<i; j=j+1) //Suche der kleinsten Zahl { if(liste[j] < kleinste_zahl) { kleinste_zahl = liste[j]; zaehler = liste[j]; } } printf("kleinste Zahl = %i, Index-Stelle = %i\n\n", kleinste_zahl, zaehler); return 0; }
Ich weiß aber nicht wie ich das machen soll. Im zaehler soll sich das gemerkt werden. Kannst du mir helfen wie das gehen soll?
-
zaehler = j;
-
#include<stdio.h> #include<ctype.h> #include<string.h> #define NMAX 100 int main() { int zahl, liste[NMAX], sortiert[NMAX]; int i, j, k, kleinste_zahl, stelle; i = 0; scanf("%i", &zahl); while(zahl != -1) { liste[i] = zahl; i = i + 1; scanf("%i", &zahl); } kleinste_zahl = liste[0]; stelle = 0; for(j=1; j<i; j=j+1) //Suche der kleinsten Zahl { if(liste[j] < kleinste_zahl) { kleinste_zahl = liste[j]; stelle = j; } } printf("kleinste Zahl = %i, Index-Stelle der Zahl = %i", kleinste_zahl, j); return 0; }
Dieser Code liefert für die Zahlenfolge 5,7,9,8,1,4,3,2 zwar die 1 als kleinste Zahl aber die Stelle stimmt nicht. Er gibt mir als Indexstelle eine 8 aus. In Wirklichkeit ist es aber doch die 4... Ehrlich gesagt, hab ich das auch schon ausprobiert...
Oder hab ich dich falsch verstanden?
-
Dann schau mal, ob du in deiner Ausgabe die richtige Variable ausgibst