¿Cómo se permite ingresar espacios usando scanf?

Resuelto Kredns asked hace 15 años • 11 respuestas

Usando el siguiente código:

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

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

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

Un usuario puede ingresar su nombre, pero cuando ingresa un nombre con un espacio como Lucas Aardvark, scanf()simplemente corta todo lo que sigue Lucas. ¿Cómo hago para scanf()permitir espacios ?

Kredns avatar Aug 08 '09 11:08 Kredns
Aceptado

Las personas (y especialmente los principiantes) nunca deben usar scanf("%s")o gets()cualquier otra función que no tenga protección contra desbordamiento del búfer, a menos que sepa con certeza que la entrada siempre tendrá un formato específico (y tal vez ni siquiera entonces).

Recuerde que scanfsignifica "escaneo formateado" y que hay muy pocos datos menos formateados que los ingresados ​​por el usuario. Es ideal si tiene control total del formato de los datos de entrada, pero generalmente no es adecuado para la entrada del usuario.

Utilice fgets()(que tiene protección contra desbordamiento del búfer) para obtener su entrada en una cadena y sscanf()evaluarla. sscanf()Dado que solo desea lo que el usuario ingresó sin analizar, en este caso realmente no lo necesita :

#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;
}
paxdiablo avatar Aug 08 '2009 04:08 paxdiablo

Intentar

char str[11];
scanf("%10[0-9a-zA-Z ]", str);
Kelly Robins avatar Aug 08 '2009 04:08 Kelly Robins

Este ejemplo utiliza un scanset invertido, por lo que scanf sigue tomando valores hasta que encuentra una nueva línea '\n', por lo que los espacios también se guardan.

#include <stdio.h>

int main (int argc, char const *argv[])
{
    char name[20];

    // get up to buffer size - 1 characters (to account for NULL terminator)
    scanf("%19[^\n]", name);
    printf("%s\n", name);
    return 0;
}
SVA avatar Aug 09 '2009 14:08 SVA

Puedes usar esto

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

O esto

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);

MANIFESTACIÓN

Vitim.us avatar Aug 22 '2013 03:08 Vitim.us