
Kredns
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 después Lucas
. como hago scanf()
permitir espacios

SVA
Este ejemplo utiliza un scanset invertido, por lo que scanf sigue tomando valores hasta que encuentra un ‘\n’– nueva línea, por lo que también se guardan espacios.
#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;
}

Vitim.es
Puedes usar esto
char name[20];
scanf("%20[^\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
getline()
Ahora parte de POSIX, sin embargo.
También soluciona el problema de asignación de búfer sobre el que preguntó anteriormente, aunque debe solucionarlo. free
ing la memoria.

Cristóbal
no usar scanf()
para leer cadenas sin especificar un ancho de campo. También debe verificar los valores devueltos en busca de errores:
#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);
}
Alternativamente, utilice fgets()
:
#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);
}
Tenga en cuenta que más idiomático es ‘malloc(sizeof(char) * 256 + 1)’, o ‘malloc(256 + 1)’, o incluso mejor (asumiendo que ‘name’ se usará estrictamente localmente) ‘char name[256+1]’. El ‘+1’ puede actuar como un mnemotécnico para el terminador nulo, que debe incluirse en la asignación.
–Barry Kelly
8 de agosto de 2009 a las 4:47
@Barry – Sospecho
sizeof(char) + 256
fue un error tipográfico.– Chris Lutz
20 de julio de 2011 a las 22:06