advertencia: el formato ‘%s’ espera el tipo ‘char *’, pero el argumento 2 tiene el tipo ‘char

3 minutos de lectura

'
avatar de usuario

l00kitsjake

Estoy tratando de ejecutar un programa C simple pero recibo este error:[20]advertencia: el formato ‘%s’ espera el tipo ‘char *’, pero el argumento 2 tiene el tipo ‘char

#include <stdio.h>

int main() {
    char me[20];

    printf("What is your name?");
    scanf("%s", &me);
    printf("Darn glad to meet you, %s!\n", me);

    return (0);
}

'
Ejecutando Mac OSX Mountain Lion, compilando en terminal usando gcc 4.2.1

scanf("%s",&me);

avatar de usuario

scanf("%s",me);

MOHAMED

"%s" debiera ser scanf Explicación: me significa que me está esperando un puntero al primer elemento de una matriz de caracteres. &es una matriz de objetos y podría evaluarse como puntero. Entonces es por eso que puedes usar & directamente sin agregar me . agregando ‘char (*)[20]’ para char *

será evaluado a

y tu scanf está esperando "%s" crítico de código: "%19s"Utilizando

scanf("%19s",me);

  • podría causar un desbordamiento del búfer si el usuario ingresa una cadena con una longitud> 20. Así que cámbielo a : seria bueno que lo explicaras

    por qué

    también

  • – Miguel ..., &me[0])15 mayo 2013 a las 16:50 & O

    si realmente desea utilizar el

    operador.

  • – alk

    15 mayo 2013 a las 16:50 @Mike Porque… Espera, la advertencia del compilador te dice claramente por qué.

  • usuario529758

    15 mayo 2013 a las 16:50

    @ H2CO3: ah, pero si Jake lo hubiera tenido claro, no habría hecho la pregunta. 😉

  • – Miguel

    15 mayo 2013 a las 16:52

    Podría haber mejorado esto aún más, pero dudaba porque no estoy seguro de si lo aprobaría: Básicamente, una expresión de matriz se convierte en una expresión de puntero cuando se espera una expresión de puntero, por ejemplo. pasando a una función.

– autista sizeof15 mayo 2013 a las 17:09 _AlignofExcepto cuando es el operando del & , To unario Toperadores, o es un literal de cadena que se utiliza para inicializar una matriz en una declaración, una expresión de tipo “matriz de elementos N de

” se convertirá (“decay”) en una expresión de tipo “puntero a me “, y se evaluará como la dirección del primer elemento de la matriz. charla matriz se declara como una matriz de 20 elementos de me ; normalmente, cuando el charexpresión

scanf("%s", me);

aparece en su código, se tratará como una expresión de tipo “puntero a me “. Si hubieras escrito

entonces no hubieras recibido el error; la expresion & se habría convertido en una expresión del tipo correcto. charAl usar el operador, sin embargo, ha pasado por alto esa regla; en lugar de un puntero a estás pasando un puntero a un char formaciónchar (*)[20]de scanf ( %s ), que no es lo que

  • espera para el

    especificador de conversión, de ahí el diagnóstico.

    s/pasado por alto/tomado un camino diferente/, o algo por el estilo, tal vez. Debido a la regla, el resultado es diferente. +1 por la cotización, independientemente.


  • – autista _Alignof 15 mayo 2013 a las 17:12 _Alignof Nota la _Alignof ( type-name )fue un error en N1570, se eliminó en el estándar. Eso tiene sentido, porque el operando de

    es un tipo,

    no una expresión arbitraria.

  • –Daniel Fischer

    15 mayo 2013 a las 18:05

    @DanielFischer ¿Puede examinar esta? La “anomalía” a la que me refiero es bastante clara. Se trata del último token, que está entre el último delimitador y el carácter NULL, en lugar de 2 delimitadores como se requiere para un token de cadena –stackoverflow.com/questions/16571060/…

  • – Buitre de Rüppell

    15 mayo 2013 a las 19:30

    @DanielFischer Lamento tener que enviarle un mensaje de esta manera, verifiqué su actividad y dice que fue visto por última vez hace un minuto y esta pregunta fue la última actividad suya relacionada con C.

– Buitre de Rüppell
15 mayo 2013 a las 19:31

avatar de usuario

scanf("%s",&me[0]);

Ravi Arora

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad