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);
}
War es hilfreich?

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:

  1. liest Zeichen von stdin
  2. 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.
  3. schreibt Zeichen auf stdout.
  4. 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:

  1. in der Funktion main Sie printString mit einem Zeiger auf den String "Hallo"
  2. nennen
  3. die printString Funktion versucht, einen Charakter mit getchar()
  4. lesen
  5. 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);

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top