webentwicklung-frage-antwort-db.com.de

Zeichenfolge aus Eingabe mit Leerzeichen lesen?

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

#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 den ganzen Namen lesen lassen?

92
Hieu Nguyen

Verwenden:

fgets (name, 100, stdin);

100 Ist die maximale Länge des Puffers. Sie sollten es an Ihre Bedürfnisse anpassen.

Verwenden:

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

Das [] Ist das gescannte Zeichen. [^\n] Teilt mit, dass während der Eingabe keine neue Zeile ('\n') Eingegeben wird. Dann liest es mit dem %*c Das Zeilenumbruchzeichen aus dem Eingabepuffer (der nicht gelesen wird), und das * Zeigt an, dass diese eingelesene Eingabe verworfen wird (Zuweisungsunterdrückung), wie Sie dies nicht tun brauche es, und diese neue Zeile im Puffer schafft kein Problem für die nächsten Eingaben, die Sie möglicherweise nehmen.

Lesen Sie hier die Operatoren Scanset und Zuweisungsunterdrückung .

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

Verwenden Sie niemals gets(). Da es unmöglich ist, zu sagen, wie viele Zeichen () gelesen werden, ohne die Daten im Voraus zu kennen, und gets() weiterhin Zeichen nach dem Ende des Puffers speichert, ist die Verwendung äußerst gefährlich. Es wurde verwendet, um die Computersicherheit zu brechen. Verwenden Sie stattdessen fgets().

164
phoxis

Versuche dies:

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

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

21
Sridhar Iyer

Im Folgenden finden Sie ein Beispiel dafür, wie Sie mithilfe der Funktion fgets Eingaben mit Leerzeichen abrufen können.

#include <stdio.h>

int main()
{
    char name[100];
    printf("Enter your name: ");
    fgets(name, 100, stdin); 
    printf("Your Name is: %s", name);
    return 0;
}
6
kyle k
scanf(" %[^\t\n]s",&str);

str ist die Variable, von der Sie den String erhalten.

5
animesh

HINWEIS: Wenn Sie fgets () verwenden, ist das letzte Zeichen im Array '\ n', wenn Sie fgets () für kleine Eingaben in CLI (Befehlszeileninterpreter) verwenden und die Zeichenfolge mit 'Enter' beenden. Wenn Sie die Zeichenfolge drucken, springt der Compiler beim Drucken der Zeichenfolge immer zur nächsten Zeile. Wenn Sie möchten, dass die Eingabezeichenfolge ein nullterminiertes Zeichenfolgenverhalten aufweist, 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 anderer Benutzer.

2
Ritesh Sharma
#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;
}
1
ayush bhorse
#include<stdio.h>
int main()
{
   char name[100];
   printf("Enter your name: ");
   scanf("%[^\n]s",name);
   printf("Your Name is: %s",name);
   return 0;
}
1
Pranta Palit

Wenn Sie mehr als eine Zeile lesen müssen, müssen Sie den Puffer löschen. Beispiel:

int n;
scanf("%d", &n);
char str[1001];
char temp;
scanf("%c",&temp); // temp statement to clear buffer
scanf("%[^\n]",str);
1
levan

Mit diesem Code können Sie Eingaben vornehmen, bis Sie die Eingabetaste Ihrer Tastatur drücken.

char ch[100];
int i;
for (i = 0; ch[i] != '\n'; i++)
{
    scanf("%c ", &ch[i]);
}
1
iFTEKHAR LIVE

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 Scanf haben, nehmen wir an, Sie haben 1 Scanf mit einem ganzzahligen Wert und einen weiteren Scanf mit einem doppelten Wert ... wenn Sie den Scanf für Ihr Zeichen (String) erreichen name) Dieser Befehl wird übersprungen und Sie können keinen Wert dafür eingeben. Wenn Sie jedoch dieses Leerzeichen vor% setzen, ist alles in Ordnung und nichts wird übersprungen.

0

"Barack Obama" hat ein Leerzeichen zwischen "Barack" und "Obama". Verwenden Sie dazu diesen Code.

#include <stdio.h>
int main()
{
    printf("Enter your name\n");
   char a[80];
   gets(a);
   printf("Your name is %s\n", a);
   return 0;
}
0
Koech

Die oben genannten Methoden funktionieren zwar, aber jede hat ihre eigenen Probleme.

Sie können getline() oder getdelim() verwenden, wenn Sie eine von posix unterstützte Plattform verwenden. Wenn Sie Windows und Minigw als Compiler verwenden, sollte es verfügbar sein.

getline() ist definiert als:

ssize_t getline(char **lineptr, size_t *n, FILE *stream);

Um Eingaben vornehmen zu können, müssen Sie zunächst einen Zeiger auf den Typ char erstellen.

#include <stdio.h>
#include<stdlib.h>

// s is a pointer to char type.
char *s;
// size is of size_t type, this number varies based on your guess of 
// how long the input is, even if the number is small, it isn't going 
// to be a problem
size_t size = 10;

int main(){
// allocate s with the necessary memory needed, +1 is added 
// as its input also contains, /n character at the end.
    s = (char *)malloc(size+1);
    getline(&s,&size,stdin);
    printf("%s",s);
    return 0;
}

Beispiel Eingabe: Hello world to the world!

Ausgabe: Hello world to the world!\n

Hier ist zu beachten, dass getline s mit realloc() neu zuweist, obwohl der zugewiesene Speicher für s 11 Byte beträgt, wobei die Eingabegröße 26 Byte beträgt.

Es spielt also keine Rolle, wie lange Ihre Eingabe dauert.

size wird mit der Anzahl der gelesenen Bytes gemäß der obigen Beispieleingabe aktualisiert. size wird 27 sein.

getline() berücksichtigt auch \n als Eingabe. Ihr 's' wird am Ende '\ n' enthalten.

Es gibt auch eine allgemeinere Version von getline(), nämlich getdelim(), für die ein weiteres Argument erforderlich ist, nämlich delimiter.

getdelim() ist definiert als:

ssize_t getdelim(char **lineptr, size_t *n, int delim, FILE *stream);

Linux-Manpage

0
nilsocket