String aus Eingabe mit Leerzeichen lesen? [duplicate]

Lesezeit: 5 Minuten

Benutzeravatar von Hieu Nguyen
Hallo Nguyen

Ich verwende Ubuntu und ich verwende auch Geany und CodeBlock als meine IDE. Was ich versuche, ist das Lesen einer Zeichenfolge (wie "Barack Obama") und in eine Variable schreiben:

#include <stdio.h>

int main(void)
{
    char name[100];

    printf("Enter your name: ");
    scanf("%s", name);
    printf("Your Name is: %s", name);

    return 0;
}

Ausgabe:

Enter your name: Barack Obama
Your Name is: Barack

Wie kann ich das Programm dazu bringen, den ganzen Namen zu lesen?

  • nur eine einfache Antwort, verwenden Sie: scanf(“%[^\n]”, Zeichen_Variablenname);

    Benutzer7122338

    22. Juni 2019 um 7:42 Uhr


Benutzeravatar von phoxis
Phoxie

Verwenden:

fgets (name, 100, stdin);

100 ist die maximale Länge des Puffers. Sie sollten es nach Ihren Bedürfnissen anpassen.

Verwenden:

scanf ("%[^\n]%*c", name);

Das [] ist das Scanset-Zeichen. [^\n] sagt, dass während der Eingang ist nicht ein Zeilenumbruch ('\n') Eingaben vornehmen. Dann mit dem %*c Es liest das Zeilenumbruchzeichen aus dem Eingabepuffer (der nicht gelesen wird) und die * gibt an, dass diese eingelesene Eingabe verworfen wird (Zuweisungsunterdrückung), da Sie sie nicht benötigen, und dieser Zeilenumbruch im Puffer kein Problem für die nächsten Eingaben darstellt, die Sie möglicherweise vornehmen.

Lesen Sie hier über die Scanset und die Zuordnungsunterdrückung Betreiber.

Beachten Sie, dass Sie auch verwenden können gets aber ….

Benutze niemals gets(). Weil es unmöglich ist zu sagen, ohne die Daten im Voraus zu kennen, wie viele Zeichen gets() lesen wird und warum gets() weiterhin Zeichen über das Ende des Puffers hinaus speichert, ist die Verwendung äußerst gefährlich. Es wurde verwendet, um die Computersicherheit zu brechen. Verwenden fgets() stattdessen.

  • @Stallman: Sie können die Zeichenfolge nicht als deklarieren char name[], das ist also keine gültige C-Syntax. Ein C-String ist eine Folge von Bytes, die durch ein Nullzeichen abgeschlossen wird. Daher können wir immer das Ende der Zeichenfolge kennen. Auch wenn wir auf eine Speicherstelle zeigen, die keinen Anfang einer Zeichenkette darstellt, wird die Zeichenkette vom Anfang der Adresse bis zum ersten Auftreten eines Nullzeichens betrachtet.

    – phoxie

    14. November 2013 um 13:24 Uhr

  • Ok… Müssen wir die Größe eines C-Strings initialisieren, wie char name[number]="somestring here"; oder char name[]="";//even nothing is created, it still exist a null character? Und wenn ich die Größe des C-Strings nicht explizit deklariere, kann ich dann eine beliebige Länge von Zeichen eingeben?

    – Alston

    14. November 2013 um 13:40 Uhr


  • @phoxis Warum die %*c ? Jeder Grund zu verwenden c, und kein anderer Buchstabe? Weil ich im Netz keinen Hinweis darauf finden konnte. Außerdem habe ich getan scanf("%[^\n]\n", name) um das Zeilenumbruchzeichen zu verwerfen und funktioniert ziemlich gut.

    – John Strood

    24. Juli 2016 um 22:09 Uhr


  • @Djack: %*c wird einfach jedes Zeichen los, sagen wir mal, wenn es das nicht ist \n .

    – phoxie

    25. Juli 2016 um 10:22 Uhr

  • %c steht für ein Zeichen, genauso wie %d für eine Ganzzahl steht, %*c für alle Zeichen. Es bedeutet also, alle Zeichen zu lesen, bis Sie auf ein neues Zeilenzeichen @NathanProgrammer stoßen

    – Niemand

    5. Juli 2017 um 15:33 Uhr


Benutzeravatar von Sridhar Iyer
Sridhar Iyer

Versuche dies:

scanf("%[^\n]s",name);

\n setzt nur das Trennzeichen für die gescannte Zeichenfolge.

  • Auch die s macht hier keinen Sinn. %[^\n] fragt bereits nach allen Zeichen außer einem Zeilenumbruch.

    – alk

    25. November 2018 um 18:54 Uhr

Hier ist ein Beispiel dafür, wie Sie Eingaben mit Leerzeichen erhalten können, indem Sie die verwenden fgets Funktion.

#include <stdio.h>

int main()
{
    char name[100];
    printf("Enter your name: ");
    fgets(name, 100, stdin); 
    printf("Your Name is: %s", name);
    return 0;
}

Benutzeravatar von animesh
animesch

scanf(" %[^\t\n]s",&str);

str ist die Variable, aus der Sie die Zeichenfolge erhalten.

Benutzeravatar von Cristian Babarusi
Christian Babarusi

Die richtige Antwort lautet:

#include <stdio.h>

int main(void)
{
    char name[100];

    printf("Enter your name: ");
    // pay attention to the space in front of the %
    //that do all the trick
    scanf(" %[^\n]s", name);
    printf("Your Name is: %s", name);

    return 0;
}

Dieses Leerzeichen vor % ist sehr wichtig, denn wenn Sie in Ihrem Programm noch ein paar Scanfs haben, sagen wir, Sie haben 1 Scanf mit einem ganzzahligen Wert und ein weiteres Scanf mit einem Double-Wert … wenn Sie das Scanf für Ihr Zeichen (String name) wird dieser Befehl übersprungen und Sie können keinen Wert dafür eingeben … aber wenn Sie dieses Leerzeichen vor % setzen, ist alles in Ordnung und nichts wird übersprungen.

  • Auch die s macht hier keinen Sinn. %[^\n] fragt bereits nach allen Zeichen außer einem Zeilenumbruch.

    – alk

    25. November 2018 um 18:52 Uhr

  • Das Ding hat mich lange genervt. Danke für die Bereitstellung der Lösung. Leerzeichen am Anfang setzen [^\n] verhindert das Überspringen der Eingabe.

    – Puspam

    10. Juni um 17:26 Uhr

HINWEIS: Wenn Sie fgets() verwenden, ist das letzte Zeichen im Array manchmal ‘\n’, wenn Sie fgets() für kleine Eingaben in CLI (Befehlszeileninterpreter) verwenden, da Sie die Zeichenfolge mit ‘Enter’ beenden. Wenn Sie also die Zeichenfolge drucken, geht der Compiler beim Drucken der Zeichenfolge immer zur nächsten Zeile. Wenn Sie möchten, dass die Eingabezeichenfolge ein nullterminiertes Zeichenfolgen-ähnliches Verhalten hat, verwenden Sie diesen einfachen Hack.

#include<stdio.h>
int main()
{
 int i,size;
 char a[100];
 fgets(a,100,stdin);;
 size = strlen(a);
 a[size-1]='\0';

return 0;
}

Update: Aktualisiert mit Hilfe von anderen Benutzern.

  • Auch die s macht hier keinen Sinn. %[^\n] fragt bereits nach allen Zeichen außer einem Zeilenumbruch.

    – alk

    25. November 2018 um 18:52 Uhr

  • Das Ding hat mich lange genervt. Danke für die Bereitstellung der Lösung. Leerzeichen am Anfang setzen [^\n] verhindert das Überspringen der Eingabe.

    – Puspam

    10. Juni um 17:26 Uhr

Benutzeravatar von ayush bhorse
ayush bhorse

#include <stdio.h>
// read a line into str, return length
int read_line(char str[]) {
int c, i=0;
c = getchar();
while (c != '\n' && c != EOF) { 
   str[i] = c;
   c = getchar();
   i++;
}
str[i] = '\0';
return i;
}

  • Eine kurze Beschreibung darüber, was Sie in Ihren Code schreiben und was das OP tun sollte, um die erforderliche Funktionalität zu erreichen, würde Ihre Antwort effizienter machen

    – Muhammad Omer Aslam

    21. November 2017 um 19:54 Uhr

  • Ihr Code berücksichtigt nicht die Größe des Arrays. Es kann überlaufen.

    – Jazz

    30. August 2018 um 16:36 Uhr

1422130cookie-checkString aus Eingabe mit Leerzeichen lesen? [duplicate]

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy