Drucken einer Zeichenfolge in C unter Verwendung einer Funktion
Frage
Ich bin ganz neu in C und ich versuche zu lernen, wie eine Zeichenfolge zu nehmen und drucken Sie es eine Funktion. Ich sehe überall Beispiele while(ch = getchar(), ch >= 0)
, aber sobald ich es in eine Funktion setzen (statt main ()), hört es an der Arbeit. Gerade jetzt, es ist in einer Endlosschleife stecken ... warum ist das denn?
// from main():
// printString("hello");
void printString(char *ch)
{
while (*ch = getchar(), *ch >= 0)
putchar(*ch);
}
Lösung
Auf der Basis Ihrer Beschreibung, die Sie gerade mögen:
void printString(char *ch)
{
while(*ch) {
putchar(*ch);
ch++;
}
}
Ihre ursprüngliche Funktion:
void printString(char *ch)
{
while (*ch = getchar(), *ch >= 0)
putchar(*ch);
}
Gibt es eine Menge Sachen:
- liest Zeichen von stdin
- speichert die gelesene Zeichen von stdin
in das erste Zeichen durch
ch
zeigte (das kann nicht einmal Arbeit, wenn Sie in einem String-Literal übergeben. - schreibt Zeichen auf stdout.
- endet, wenn die gelesene Zeichen <0 (das wird nicht funktioniert auf einigen Plattformen. Da das Ergebnis in einem char gespeichert ist, können Sie nicht zwischen EOF und einem gültigen Zeichen unterscheiden. Ch sollte ein int sein, wie getchar ( ) gibt ein int, so dass Sie für EOF überprüfen)
Andere Tipps
getchar()
liest Benutzereingaben von stdin. Wenn Sie die Zeichenfolge drucken möchten in dann übergeben wird für getchar()
gibt es keine Notwendigkeit.
Nehmen wir es Schritt für Schritt. Die Schleifen Sie liest ein Zeichen eine Zeit von stdin, bis es am Ende der Datei erreicht. Das ist, was die ch >= 0
Test überprüft: so lange lesen Sie, wie wir bekommen gültige Zeichen. Zum Drucken der Zeichen eines Strings, ändert sich der Zustand. Nun wird ein gültiges Zeichen ist etwas, das ist nicht NUL ('\0'
). So werden wir die Schleifenbedingung ändern:
while (*ch != '\0')
Als nächstes wird Bezifferung der Schleife aus. putchar(*ch)
ist in Ordnung; wir, dass es verlassen. Aber ohne getchar()
müssen wir herausfinden, was die entsprechende Aussage „das nächste Zeichen bekommen“ ist.
Das wäre ch++
sein. Dies fördert die ch
Zeiger auf das nächste Zeichen in der Zeichenfolge. Wenn wir das am Ende der Schleife setzen dann werden wir ein Zeichen, vorab einen Raum drucken, und dann prüfen, ob das nächste Zeichen nicht-NUL ist. Wenn es dann drucken wir es, fortschritt, und zu überprüfen.
while (*ch != '\0') {
putchar(*ch);
ch++;
}
Was hier passiert, ist die folgende:
- in der Funktion
main
SieprintString
mit einem Zeiger auf den String "Hallo" nennen
- die
printString
Funktion versucht, einen Charakter mitgetchar()
lesen
- und speichert das Zeichen an der Stelle des ‚h‘
Die Regeln der Sprache sagen, dass der Versuch, dass ‚h‘ zu ändern, ist nicht definiertes Verhalten. Wenn Sie Glück haben, Ihr Programm stürzt; wenn Sie sehr unglücklich es funktioniert das Programm nicht angezeigt.
Kurz gesagt: getchar()
dient zum Lesen; putchar()
zum Schreiben verwendet wird.
Und Sie wollen 5 Brief schreiben: 'h', 'e', ??'l', 'o' und andere 'o'
.hello ^ ch is a pointer ch *ch is 'h' -- ch points to an 'h'
Gibt es etwas, nach dem letzten ‚o‘? Es ist! A '\0'
. Der Null-Byte beendet die Zeichenkette. Also versuchen Sie diesen (mit printString("hello");
) ...
void printString(char *ch)
{
putchar(*ch); /* print 'h' */
ch = ch + 1; /* point to the next letter. */
/* Note we're changing the pointer, */
/* not what it points to: ch now points to the 'e' */
putchar(*ch); /* print 'e' */
ch = ch + 1; /* point to the next letter. */
putchar(*ch); /* print 'l' */
ch = ch + 1; /* point to the next letter. */
putchar(*ch); /* print 'l' */
ch = ch + 1; /* point to the next letter. */
putchar(*ch); /* print 'o' */
ch = ch + 1; /* point to the next letter. What next letter? The '\0'! */
}
Sie können auch, dass in einer Schleife schreiben (und rufen aus dem Haupt mit verschiedenen Argumenten) ...
void printString(char *ch)
{
while (*ch != '\0')
{
putchar(*ch); /* print letter */
ch = ch + 1; /* point to the next letter. */
}
}
Ich würde nur tun printf("%s",str);
oder puts(str);