
Wortspiel erstellen (toupper / tolower)
Re: Wortspiel erstellen (toupper / tolower)
Das würde jedenfalls Sinn ergeben, ich versuche es mal so einzubauen 

-
- Beiträge: 236
- Registriert: Do Feb 10, 2011 6:31 pm
Re: Wortspiel erstellen (toupper / tolower)
Modulo (%) teilt ganzzahlig und gibt den Rest zurück. So kann man zB leicht feststellen ob eine Zahl gerade oder ungerade istBulli hat geschrieben:
Wobei ich das mit dem i%2 im Prinzip zwar verstehe, aber nicht ganz nachvollziehen kann...
Code: Alles auswählen
2 / 2 = 1 //Rest 0
3 / 2 = 1 //Rest 1
2 % 2 = 0
3 % 2 = 1
if (x % 2 == 0)
// gerade Zahl
else if (x % 2 == 1)
// ungerade Zahl
Re: Wortspiel erstellen (toupper / tolower)
Ah alles klar; ja das hilft definitiv!
Also mein Code dürfte dann ja eigentlich halbwegs in die richtige Richtung laufen denke ich
Ich bekomme bei der Ausgabe halt (null) raus für mein String "Eingabe[Grenze].
Ich mache bestimmt irgendetwas grundlegend falsch aber ich sehe den Fehler auch nicht ganz.
Der Logik nach müsste es ja jetzt so sein, dass für gerade i toupper und ungerade i tolower angewendet wird?
Auf jeden Fall wäre ein kurzes Dankeschön angebracht an Euch!
Habe jetzt an diesem Tag mehr erreicht als in der letzten Woche..
Also mein Code dürfte dann ja eigentlich halbwegs in die richtige Richtung laufen denke ich
Code: Alles auswählen
#include <stdio.h>
#include <ctype.h>
#include <string.h>
int main(void)
{
int i = 0;
int Grenze;
char Eingabe[50];
printf("Geben Sie bitte einen beliebigen Text ein mit bis zu 50 Buchstaben ein!\n");
scanf("%s",&Eingabe);
Grenze = strlen (Eingabe);
if (Grenze >= 50)
{
printf("Ihre Eingabe ueberschreitet 50 Zeichen! Das Programm wird nun beendet.");
return (1);
}
for (i; i>= 50; i++)
{
if (i % 2 == 0)
{
Eingabe[Grenze] = toupper(Eingabe[i]);
i++;
}
else if (i % 2 == 1)
{
Eingabe[Grenze] = tolower(Eingabe[i]);
i++;
}
}
printf("\nSie haben %d Zeichen und %s eingegeben",Grenze, Eingabe[Grenze]);
return(0);
}
Ich mache bestimmt irgendetwas grundlegend falsch aber ich sehe den Fehler auch nicht ganz.
Der Logik nach müsste es ja jetzt so sein, dass für gerade i toupper und ungerade i tolower angewendet wird?
Auf jeden Fall wäre ein kurzes Dankeschön angebracht an Euch!
Habe jetzt an diesem Tag mehr erreicht als in der letzten Woche..

- cloidnerux
- Moderator
- Beiträge: 3125
- Registriert: Fr Sep 26, 2008 4:37 pm
- Wohnort: Ram (Gibts wirklich)
Re: Wortspiel erstellen (toupper / tolower)
das "%s" im printf erwartet einen Pointer auf den Start deines Textes, der mit einem Null-Byte(0) anbgeschlossen ist.Ich bekomme bei der Ausgabe halt (null) raus für mein String "Eingabe[Grenze].
Eingabe[Grenze] greift auf das char in dem array "Eingabe" mit dem Index Grenze zu.
Lass den Teil [Grenze] weg und es sollte funktionieren.
Redundanz macht wiederholen unnötig.
quod erat expectandum
quod erat expectandum
Re: Wortspiel erstellen (toupper / tolower)
Endlich, nun Endlich funktioniert es !
Das Einzige Problem stellt jetzt nur noch dar, dass wenn ich etwas mit Leerzeichen eingebe ("Morgenstund hat Gold im Mund"),
so nimmt er nur "Morgenstund" auf, den Rest missachtet er. Das ist laut Aufgabenstellung nicht gewollt, sondern soll mit eingelesen werden bis 50 Zeichen.
Ebenfalls soll es bei "nicht-Buchstaben" nicht umwandeln -> wenn z.B. Eingabe: "f5f6f9f8f5f8f7f2" kommt "F5F6F9F8F5F8F7F2" raus.
Dabei sollte es "F5f6F9f8F5f8F7f2" werden, soweit ich es richtig verstanden habe...
Ansonsten sieht das Ergebnis aber Prima aus!

Code: Alles auswählen
#include <stdio.h>
#include <ctype.h>
#include <string.h>
int main(void)
{
int i = 0;
int Grenze;
char Eingabe[50];
printf("Geben Sie bitte einen beliebigen Text ein mit bis zu 50 Buchstaben ein!\n");
scanf("%s",&Eingabe);
Grenze = strlen (Eingabe);
if (Grenze >= 50)
{
printf("Ihre Eingabe ueberschreitet 50 Zeichen! Das Programm wird nun beendet.");
return (1);
}
for (i=0; i<=Grenze; i++)
{
if (i % 2 == 0)
{
Eingabe[i] = toupper(Eingabe[i]);
i++;
}
}
for (i=0; i<=Grenze; i++)
{
if (i % 2 == 1)
{
Eingabe[i] = tolower(Eingabe[i]);
i++;
}
}
printf("\nSie haben %d Zeichen und %s eingegeben",Grenze, Eingabe);
return(0);
}
so nimmt er nur "Morgenstund" auf, den Rest missachtet er. Das ist laut Aufgabenstellung nicht gewollt, sondern soll mit eingelesen werden bis 50 Zeichen.
Ebenfalls soll es bei "nicht-Buchstaben" nicht umwandeln -> wenn z.B. Eingabe: "f5f6f9f8f5f8f7f2" kommt "F5F6F9F8F5F8F7F2" raus.
Dabei sollte es "F5f6F9f8F5f8F7f2" werden, soweit ich es richtig verstanden habe...
Ansonsten sieht das Ergebnis aber Prima aus!

Re: Wortspiel erstellen (toupper / tolower)
Ich würde nur eine Schleife mitlaufen lassen und noch eine Zählervariable nur für Buchstaben also sowas in der Art:
Code: Alles auswählen
int onlychar = 0;
for (i=0; i<=Grenze; i++)
{
if(isalpha(Eingabe[i]))
{
if (onlychar % 2 == 1)
tolower(Eingabe[i]);
else
toupper(Eingabe[i]);
onlychar++;
}
}
Unwissenheit ist ein Segen
Re: Wortspiel erstellen (toupper / tolower)
du kannst auch jeweils überprüfen, ob die Werte in einem gewissen ASCII-Bereich sind und nur dann den Code ausführen 

Re: Wortspiel erstellen (toupper / tolower)
Das mit dem ASCII Bereich ist eine echt tolle Idee!
Mir wäre es jetzt zu Schade den Code weiter umzubauen da es gerade ja relativ gut funktioniert, jedoch merke ich mir das auf jeden Fall! Ist ein guter "Trick"
Ich kriege es zwar leider noch immer nicht hin einen String mit Komma einzulesen (Bei "advhbhe adfahbdev avrbnj rs" wird nur bis zum ersten Komma "advhbhe" eingelesen, jedoch muss ich wohl damit leben, da ich in keinster Weise bislang das Problem beheben konnte.
Jedenfalls astreine Hilfestellung eurerseits, vielen Dank!
Mir wäre es jetzt zu Schade den Code weiter umzubauen da es gerade ja relativ gut funktioniert, jedoch merke ich mir das auf jeden Fall! Ist ein guter "Trick"

Ich kriege es zwar leider noch immer nicht hin einen String mit Komma einzulesen (Bei "advhbhe adfahbdev avrbnj rs" wird nur bis zum ersten Komma "advhbhe" eingelesen, jedoch muss ich wohl damit leben, da ich in keinster Weise bislang das Problem beheben konnte.
Jedenfalls astreine Hilfestellung eurerseits, vielen Dank!
Re: Wortspiel erstellen (toupper / tolower)
Du meinst Leerzeichen, nicht Komma, oder?Bulli hat geschrieben:Ich kriege es zwar leider noch immer nicht hin einen String mit Komma einzulesen (Bei "advhbhe adfahbdev avrbnj rs" wird nur bis zum ersten Komma "advhbhe" eingelesen, jedoch muss ich wohl damit leben, da ich in keinster Weise bislang das Problem beheben konnte.
Das Problem ist dein scanf-Aufruf. %s liest eben nur Nicht-Whitespace-Zeichen. Versuch es mal mit
Code: Alles auswählen
scanf("%[^\n]", &Eingabe);
- Xin
- nur zu Besuch hier
- Beiträge: 8862
- Registriert: Fr Jul 04, 2008 11:10 pm
- Wohnort: /home/xin
- Kontaktdaten:
Re: Wortspiel erstellen (toupper / tolower)
scanf ist eine Funktion für ->f<-ormatiertes einlesen von ASCII-Texten.Bulli hat geschrieben:Ich kriege es zwar leider noch immer nicht hin einen String mit Komma einzulesen (Bei "advhbhe adfahbdev avrbnj rs" wird nur bis zum ersten Komma "advhbhe" eingelesen, jedoch muss ich wohl damit leben, da ich in keinster Weise bislang das Problem beheben konnte.
Schau Dir doch mal fgets() an. Hier steht das f vorne und deswegen für ->F<-ile. Die Konsole heißt - wenn man sie als File betrachtet - 'stdin'.
Außerdem ist scanf() gemeingefährlich beim Einlesen von Strings. (siehe Fehlerquellen)
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.
Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.
Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.