String aus Eingabe mit Leerzeichen lesen? [duplicate]
Lesezeit: 5 Minuten
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
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.
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
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;
}
animesch
scanf(" %[^\t\n]s",&str);
str ist die Variable, aus der Sie die Zeichenfolge erhalten.
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
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
14221300cookie-checkString aus Eingabe mit Leerzeichen lesen? [duplicate]yes
nur eine einfache Antwort, verwenden Sie: scanf(“%[^\n]”, Zeichen_Variablenname);
– Benutzer7122338
22. Juni 2019 um 7:42 Uhr