2012-05-24 34 views
12
#include <stdio.h> 
int main(void) 
{ 
    int i,j,k; 
    char st; 
    printf("enter string\n"); 
    scanf("%s", st); 
    printf("the entered string is %s\n", st); 
} 

compilación anterior programa me da una advertencia:formato '% s' espera argumento de tipo 'char *'

warning: format '%s' expects argument of type 'char *', but argument 2 has type 'int' [-Wformat] 
palindrom.c:8:1: warning: format '%s' expects argument of type 'char *', but argument 2 has type 'int' [-Wformat] 

¿qué estoy haciendo mal aquí?

Esto es lo que sucede cuando lo ejecuto:

$ ./a.out 
enter string 
kiaaa 
the entered string is (null) 

Editar:

Aquí es otra versión del código (hecho char st; en char *st):

#include <stdio.h> 
int main(void) 
{ 
    int i,j,k; 
    char *st; 
    printf("enter string\n"); 
    scanf("%s", st); 
    printf("the entered string is %s\n", st); 
} 

Sin embargo , se comporta de la misma manera en tiempo de ejecución.

+0

Ahora su 'char * st;' es un puntero no inicializado. No sabes dónde apunta. Acceder a él en 'scanf' es un comportamiento indefinido. Debe hacer que apunte a un trozo suficientemente grande de memoria válida. O bien declara una matriz 'char st [100];' - el nombre de la matriz se convierte en un puntero cuando se pasa como un argumento a 'scanf' o' printf', así que está bien - o lo declara como un puntero, como lo has hecho, y asignar algo de memoria, 'st = malloc (100 * sizeof * st);' antes de usarlo. Necesitas '#include ' para 'malloc', y verificar si' malloc' devolvió 'NULL'. –

Respuesta

8

char st es un solo personaje A juzgar por el resto de su código, es probable que la intención de declarar una matriz de caracteres:

char st[80]; 
1

Tiene un error de coincidencia de tipo.
scanf no es seguro tipo, debe proporcionar el tipo adecuado. scanf le permite obtener datos de la entrada y necesita decirle cuál es el tipo de datos que desea leer. Le pide que lea una cadena especificando %s proporcionándole una variable de caracteres.

Hace falta un array:

#define MAX_LENGTH 256 
char st[MAX_LENGTH]; 

Como @Jerry señala con razón, sólo puede sencilla evitar todos los problemas mediante el uso de:
getline() en lugar de utilizar scanf

+2

... y luego especifique la longitud máxima cuando llama a 'scanf' - como es, la llamada con solo'% s' en lugar de '% 255s' es más o menos equivalente a llamar a' gets'. –

+0

@JerryCoffin: Bien, señaló. gracias –

+1

¡Eso ciertamente no fue pensado para recomendar que alguien use 'get' (alguna vez)! –

-1

uso char *st; o matriz como char st[50]

Cuando complete el uso del puntero char, debe anular la planificación de la memoria utilizada por puntero. Eso se puede hacer utilizando la función free(st);.

EDIT: Como está imprimiendo la cadena y si está utilizando el puntero, se puede hacer como:

printf("the entered string is %s\n",st); 
printf("the entered string is %s\n",*st); // This will work in both cases if you use char *st or char st[50] 
+1

Si va a recomendar 'char *', también recomiende una forma de asignar/liberar memoria. – NPE

+0

Si lo uso como char * st, ¿cómo debo hacer para imprimirlo? 'char * st; printf ("enter string \ n"); scanf ("% s", st); printf ("la cadena ingresada es% s \ n", * st); ' –

+0

@RegisteredUser: siga adelante con su solución. o también puede usar printf ("la cadena ingresada es% s \ n", st); –

0

st es el tipo de carbón & st es el tipo de char * Cuida de la diferencia. Por cierto, solo un carácter no se puede usar para almacenar una cadena. Use la matriz char [].

1

scanf necesita un puntero a char* para indicar que está escaneando una cadena.

Está suministrando un carácter que está asignado en la pila.

O desea utilizar un getchar() o hacer st una matriz de caracteres.

0

Como ya han dicho que quieren crear una matriz:

Cambio char st; a char st[10]; o lo que sea matriz de tamaño que desee.

Con el cambio anterior st es una matriz que tiene 10 elementos individuales que pueden contener un único valor de caracteres.

0

carbón st es un personaje es decir, se almacenará sólo un carácter probarlo como esto main() char st [100]; scanf("%s",st); acaba de cambiar estas tres líneas y funcionará será la única excepción de cadenas de palabras individuales aquí se ha declarado la función como un int que es int main() mantenlo como main() y funcionará

Cuestiones relacionadas