web-dev-qa-db-de.com

Wie lassen Sie mit scanf Leerzeichen eingeben?

Verwenden Sie den folgenden Code:

char *name = malloc(sizeof(char) + 256); 

printf("What is your name? ");
scanf("%s", name);

printf("Hello %s. Nice to meet you.\n", name);

Ein Benutzer kann seinen Namen eingeben, aber wenn er einen Namen mit einem Leerzeichen wie Lucas Aardvark eingibt, unterbricht scanf() alles nach Lucas. Wie kann ich scanf() Leerzeichen zulassen?

117
Kredns

Personen (und insbesondere Anfänger) sollten niemals scanf("%s") oder gets() oder andere Funktionen ohne Pufferüberlaufschutz verwenden, es sei denn, Sie wissen genau, dass die Eingabe immer ein bestimmtes Format hat (und möglicherweise auch nicht). .

Denken Sie daran, dass scanf für "scan formatiert" steht und es gibt wertvolle less -Formate als vom Benutzer eingegebene Daten. Dies ist ideal, wenn Sie die vollständige Kontrolle über das Eingangsdatenformat haben, aber generell ungeeignet für Benutzereingaben sind.

Verwenden Sie fgets() (welche über einen Pufferüberlaufschutz verfügt), um Ihre Eingabe in einen String zu laden, und sscanf(), um sie auszuwerten. Da Sie nur möchten, was der Benutzer ohne Analyse eingegeben hat, brauchen Sie sscanf() in diesem Fall sowieso nicht wirklich:

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

/* Maximum name size + 1. */

#define MAX_NAME_SZ 256

int main(int argC, char *argV[]) {
    /* Allocate memory and check if okay. */

    char *name = malloc(MAX_NAME_SZ);
    if (name == NULL) {
        printf("No memory\n");
        return 1;
    }

    /* Ask user for name. */

    printf("What is your name? ");

    /* Get the name, with size limit. */

    fgets(name, MAX_NAME_SZ, stdin);

    /* Remove trailing newline, if there. */

    if ((strlen(name) > 0) && (name[strlen (name) - 1] == '\n'))
        name[strlen (name) - 1] = '\0';

    /* Say hello. */

    printf("Hello %s. Nice to meet you.\n", name);

    /* Free memory and exit. */

    free (name);
    return 0;
}
164
paxdiablo

Versuchen

char str[11];
scanf("%10[0-9a-zA-Z ]", str);

Hoffentlich hilft das. 

113
Kelly Gendron

In diesem Beispiel wird ein invertiertes Scanset verwendet. Daher nimmt scanf so lange Werte an, bis ein '\ n' - Zeilenvorschub auftritt, sodass auch Leerzeichen gespeichert werden

#include <stdio.h>

int main (int argc, char const *argv[])
{
    char name[20];
    scanf("%[^\n]s",name);
    printf("%s\n", name);
    return 0;
}
45
SVA

Sie können dies verwenden

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

Oder dieses

void getText(char *message, char *variable, int size){
    printf("\n %s: ", message);
    fgets(variable, sizeof(char) * size, stdin);
    sscanf(variable, "%[^\n]", variable);
}

char name[20];
getText("Your name", name, 20);

DEMO

21
Vitim.us

Verwenden Sie scanf() nicht zum Lesen von Strings ohne Angabe einer Feldbreite. Sie sollten auch die Rückgabewerte auf Fehler überprüfen:

#include <stdio.h>

#define NAME_MAX    80
#define NAME_MAX_S "80"

int main(void)
{
    static char name[NAME_MAX + 1]; // + 1 because of null
    if(scanf("%" NAME_MAX_S "[^\n]", name) != 1)
    {
        fputs("io error or premature end of line\n", stderr);
        return 1;
    }

    printf("Hello %s. Nice to meet you.\n", name);
}

Alternativ können Sie fgets() verwenden:

#include <stdio.h>

#define NAME_MAX 80

int main(void)
{
    static char name[NAME_MAX + 2]; // + 2 because of newline and null
    if(!fgets(name, sizeof(name), stdin))
    {
        fputs("io error\n", stderr);
        return 1;
    }

    // don't print newline
    printf("Hello %.*s. Nice to meet you.\n", strlen(name) - 1, name);
}
7
Christoph

Sie können die Funktion fgets() verwenden, um einen String zu lesen, oder scanf("%[^\n]s",name); verwenden, damit das Lesen von Strings bei einem Zeilenumbruch endet.

6
Anshul garg

getline()

Jetzt Teil von POSIX.

Es kümmert sich auch um das Pufferzuordnungsproblem, das Sie zuvor angefragt haben, obwohl Sie sich um freeing des Speichers kümmern müssen.

4
dmckee

Wenn noch jemand sucht, hat sich Folgendes für mich bewährt - eine beliebige Länge einer Zeichenfolge einschließlich Leerzeichen zu lesen.

Vielen Dank an vielen Postern im Internet für das Teilen dieser einfachen und eleganten Lösung ... Wenn es funktioniert, geht es ihnen gut.

char *name;
scanf ("%m[^\n]s",&name);
printf ("%s\n",name);
4
Always Learning

Sie können scanf für diesen Zweck mit einem kleinen Trick verwenden. Eigentlich sollten Sie Benutzereingaben zulassen, bis der Benutzer die Eingabetaste (\n) drückt. Dies wird jeden Charakter berücksichtigen, einschließlich space. Hier ist ein Beispiel:

int main()
{
  char string[100], c;
  int i;
  printf("Enter the string: ");
  scanf("%s", string);
  i = strlen(string);      // length of user input till first space
  do
  {
    scanf("%c", &c);
    string[i++] = c;       // reading characters after first space (including it)
  } while (c != '\n');     // until user hits Enter
  string[i - 1] = 0;       // string terminating
return 0;
}

Wie das geht Wenn der Benutzer Zeichen aus der Standardeingabe eingibt, werden diese in gespeichert schnur variabel bis zum ersten Leerzeichen. Danach verbleibt der Rest des Eintrags im Eingabestrom und wartet auf den nächsten Scanf. Als nächstes haben wir eine for-Schleife, die char by char aus dem Eingabestrom (bis \n) entnimmt und sie bis zum Ende aufhängt schnur variabel und bildet somit eine vollständige Zeichenfolge, die der Benutzereingabe über die Tastatur entspricht.

Hoffe das hilft jemandem! 

1
akelec

Während Sie scanf() wirklich nicht für diese Art von Dingen verwenden sollten, da es viel bessere Aufrufe wie gets() oder getline() gibt, können Sie Folgendes tun:

#include <stdio.h>

char* scan_line(char* buffer, int buffer_size);

char* scan_line(char* buffer, int buffer_size) {
   char* p = buffer;
   int count = 0;
   do {
       char c;
       scanf("%c", &c); // scan a single character
       // break on end of line, string terminating NUL, or end of file
       if (c == '\r' || c == '\n' || c == 0 || c == EOF) {
           *p = 0;
           break;
       }
       *p++ = c; // add the valid character into the buffer
   } while (count < buffer_size - 1);  // don't overrun the buffer
   // ensure the string is null terminated
   buffer[buffer_size - 1] = 0;
   return buffer;
}

#define MAX_SCAN_LENGTH 1024

int main()
{
   char s[MAX_SCAN_LENGTH];
   printf("Enter a string: ");
   scan_line(s, MAX_SCAN_LENGTH);
   printf("got: \"%s\"\n\n", s);
   return 0;
}
0
Ed Zavada
/*reading string which contains spaces*/
#include<stdio.h>
int main()
{
   char *c,*p;
   scanf("%[^\n]s",c);
   p=c;                /*since after reading then pointer points to another 
                       location iam using a second pointer to store the base 
                       address*/ 
   printf("%s",p);
   return 0;
 }
0
venkata sandeep