String-Eingabe mit scanf
Teil des Abschnitts Logik & Ablauf der C-Journey von Coddy. Lektion 14 von 63.
Nachdem Sie nun verstehen, wie Strings mit dem Null-Terminator funktionieren, ist es an der Zeit zu lernen, wie man String-Eingaben von Benutzern erhält. Die Funktion scanf kann Strings mit dem Formatbezeichner %s lesen, bringt jedoch wichtige Einschränkungen mit sich, die Sie verstehen müssen.
Um eine Zeichenkette mit scanf einzulesen, verwendest du das Format %s und übergibst den Namen deines Zeichenarrays (ohne den Operator &, da Arraynamen bereits Adressen sind):
char word[50];
printf("Enter a word: ");
scanf("%s", word);
printf("You entered: %s\n", word);Allerdings hat scanf("%s", ...) eine entscheidende Einschränkung: Es hört auf zu lesen, sobald es auf ein Whitespace-Zeichen (Leerzeichen, Tabulator oder Zeilenumbruch) stößt. Das bedeutet, wenn ein Benutzer "Hello World" eingibt, wird scanf nur "Hello" erfassen und "World" im Eingabepuffer belassen.
Ein weiteres ernstes Problem ist, dass scanf nicht prüft, ob die Eingabe in Ihr Array passt. Wenn jemand ein Wort eingibt, das länger ist, als Ihr Array aufnehmen kann, führt dies zu einem Pufferüberlauf, was potenziell Ihr Programm zum Absturz bringen oder Sicherheitslücken erzeugen kann. Stellen Sie immer sicher, dass Ihr Zeichen-Array groß genug für die erwartete Eingabe ist.
Trotz dieser Einschränkungen ist scanf("%s", ...) perfekt geeignet, um einzelne Wörter zu lesen, was genau das ist, was Sie in der kommenden Herausforderung üben werden.
Aufgabe
EinfachSchreibe ein C-Programm, das demonstriert, wie man mit scanf Zeichenketteneingaben vom Benutzer liest und wieder ausgibt. Dein Programm sollte:
- Ein Zeichenarray namens
usernamemit 30 Elementen deklarieren, um die Eingabe des Benutzers zu speichern - Ein Zeichenarray namens
hobbymit 25 Elementen deklarieren, um eine weitere Eingabe zu speichern printfverwenden, um den Benutzer mit der Nachricht „Gib deinen Benutzernamen ein:“ aufzufordernscanfmit dem Formatspezifizierer%sverwenden, um den Benutzernamen in das Arrayusernameeinzulesenprintfverwenden, um den Benutzer mit der Nachricht „Gib dein Hobby ein:“ aufzufordernscanfmit dem Formatspezifizierer%sverwenden, um das Hobby in das Arrayhobbyeinzulesen- Beide Zeichenketten mit
printfexakt im unten gezeigten Format ausgeben
Die Eingabe wird als zwei separate einzelne Wörter bereitgestellt (ohne Leerzeichen innerhalb der einzelnen Wörter).
Deine Ausgabe sollte die Ergebnisse im folgenden Format anzeigen:
Enter your username:
Enter your hobby:
Hello [username], your hobby is [hobby]!Wenn der Benutzer beispielsweise „Alice“ als Benutzernamen und „reading“ als Hobby eingibt, sollte die Ausgabe folgendermaßen aussehen:
Enter your username:
Enter your hobby:
Hello Alice, your hobby is reading!Diese Aufgabe prüft dein Verständnis der Verwendung von scanf mit dem Formatspezifizierer %s zum Einlesen von Zeichenkettendaten, der korrekten Deklaration eines Zeichenarrays mit ausreichender Größe sowie der Kombination von Benutzereingaben mit formatierter Ausgabe mithilfe von printf.
Probier es selbst
#include <stdio.h>
int main() {
// TODO: Deklarieren Sie hier Ihre Zeichen-Arrays
// TODO: Schreiben Sie hier Ihren Code, um die Eingabe aufzufordern und zu lesen
// TODO: Geben Sie die endgültige Ausgabenachricht aus
return 0;
}Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Logik & Ablauf
1Zeiger-Grundlagen
Was ist ein Zeiger?Zeiger deklarierenDer Adressoperator (&)Der Dereferenzierungsoperator (*)NULL-ZeigerZusammenfassung: Zeiger-Grundlagen4Projekt: Einfaches Text-Tool
ProjektübersichtZeichen zählen2Pointer und Arrays
Array-Namen als PointerArray-Elemente - PointerPointer-ArithmetikPointer vergleichenWiederholung: Array-Durchlauf mit Pointern5Zeiger und Funktionen
Wertübergabe (Pass-by-Value)Zeiger an Funktionen übergebenVariablen über Zeiger ändernEin klassisches Beispiel: SwapArrays an Funktionen übergebenZusammenfassung: Zeiger als Funktionsargumente8Structs und Zeiger
Zeiger auf StructsDer Pfeiloperator (->)Structs per Wert übergebenÜbergabe von Struct-ZeigernDynamische Allokation von StructsZusammenfassung: Struct ändern - Ptr11Finale Wiederholungsaufgaben
Wiederholung: Dynamische String-KonkatenationWiederholung: Array von StructsWiederholung: Wortfrequenz-Zähler3Character-Arrays und Strings
Strings als char-ArraysDer Null-TerminatorString-Eingabe mit scanfVerwendung von strlen()Verwendung von strcpy()Verwendung von strcat()Verwendung von strcmp()Zusammenfassung: Grundlegende String-FunktionenÜbe selbstständig: Online-C-Compiler