2012-08-13 21 views
6

Por alguna razón las siguientes impresiones de código (nulo):scanf asignación dinámica

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

int main(void) 
{ 
    char *foo; 
    scanf("%ms", &foo); 
    printf("%s", foo); 
    free(foo); 
} 

Estoy intentando asignar memoria para una cadena de forma dinámica, pero como he dicho antes mi programa simplemente da salida (nulo). Trabajé alrededor de esto haciendo una función usando getche y realloc pero parece casi inútil debido al hecho de que también tuve que programar lo que sucedería si el usuario ingresara retroceso, tabulación, etc. Pero como dije eso es solo un trabajo alrededor y yo preferiría saber por qué el código anterior no está funcionando ...

Información adicional:

estoy usando el V7.00 Pelles C IDE y compilar con la norma C11

+0

¿Qué pretende hacer '% ms'? –

+0

@Greg El indicador m debe asignar dinámicamente memoria para contener la entrada. –

+3

¿Es eso no estándar? No veo eso en mi documentación 'scanf'. –

Respuesta

9

no estoy viendo %m en la sección 7.21.6.2 del Draft C11 standard (la sección en fscanf). Le sugiero que lo evite y llame al malloc() como lo haría en C99.

+2

Dado que no se puede predecir cuánto espacio asignar con 'scanf ("% s ")', también recomendaría evitar 'scanf' por completo y usar' fgets' y 'sscanf '. – jamesdlin

+4

La notación'% ms' es una extensión POSIX en ['scanf()'] (http://pubs.opengroup.org/onlinepubs/9699919799/functions/scanf.html) en comparación con la versión C estándar de ' scanf() '. –

0

% m es una extensión de GNU, que puede ser por qué no es disponible en Pelles C.

+4

Es una extensión POSIX en lugar de solo una extensión GNU. –

0

estoy usando Linux 3.2.0 amd 64 con gcc 4.7.2. Usando el código:

char *s; 
scanf("%ms", &s); 
printf("%s", s); 
free(s); 

funciona bien pero no aceptará espacios en blanco.

para la asignación estática, se puede utilizar en su lugar:

char s[100]; 
printf("Enter string (max 99 characters): "); 
scanf("%100[^\n]s", &s); 
printf("You entered: %s\n", s); 

espero que ayude!

+0

Lo siento pero no lo estás ayudando porque si echas un vistazo a la función' scanf() 'definitivamente te darás cuenta de que está mal ! debe ser 'scanf ("% ms ", s)' como s es un puntero en sí mismo! se nota que no hay '&' antes de 's'. Además, tenga en cuenta que no funcionará para el próximo 'scanf' en el programa si hay alguno !!! Espero que esté claro !!! –

+3

@ Meninx: no, con '% ms', debe ser' scanf ("% ms", & s) '. La extensión POSIX 'm' asigna la cadena para usted y la asigna a' s', que debe ser de tipo 'char *'. –

+1

@RudyVelthuis ¡Tienes razón! Gracias por señalar eso! :) –

0

como Arun dice, esta solución es correcta y Meninx 'opinión s es erróneo:

char *s; 
scanf("%ms", &s); 
printf("%s", s); 
free(s); 

He leído el 'hombre scanf', que dice:

Un opcional 'carácter m'. Esto se usa con conversiones de cadenas (% s,% c,% [),
y alivia al llamante de la necesidad de asignar un búfer correspondiente a mantener la entrada: en su lugar, scanf() asigna un búfer de tamaño suficiente, y asigna la dirección de esta memoria intermedia a la que corresponde puntero argumento, que debe ser un puntero a una variable char * (esta variable no tiene que ser inicializado antes de la llamada). La persona que llama debe liberar posteriormente (3) este búfer cuando ya no sea necesario.

Cuestiones relacionadas