2012-07-31 24 views
14

He siguiente código:Cómo imprimir correctamente el entero y la cadena en c?

char *s1, *s2; 
char str[10]; 

printf("type a string: "); 
scanf("%s", str); 

s1 = &str[0]; 
s2 = &str[2]; 

printf("%s\n", s1); 
printf("%s\n", s2); 

Cuando ejecuto el código, y entrar en la entrada "A 1" de la siguiente manera:

type a string: A 1 

me dieron el siguiente resultado:

A 
�<� 

Intento leer el primer carácter como una cadena y el tercer carácter como un entero, y luego imprimirlos en la pantalla. El primer personaje siempre funciona, pero la pantalla solo muestra elementos aleatorios después de eso ... ¿Cómo debo solucionarlo?

Gracias

+1

Otra cosa que la gente no había mencionado un poco: por favor no scanf en un búfer de tamaño limitado. El usuario puede simplemente ingresar más que el límite y atornillar su programa. (ver también: ataques de desbordamiento de búfer) –

+0

@DennisMeng: Se puede agregar un especificador de ancho, por ej. '% 123s'. Todavía es potencialmente peligroso ya que ese ancho no incluye el terminador nulo. – diapir

+0

@diapir Verdad. Lo importante es evitar el desbordamiento del búfer. –

Respuesta

22

Estás en el camino correcto. Aquí hay una versión corregida:

char str[10]; 
int n; 

printf("type a string: "); 
scanf("%s %d", str, &n); 

printf("%s\n", str); 
printf("%d\n", n); 

Vamos a hablar a través de los cambios:

  1. destinar un int (n) para almacenar su número en
  2. decir scanf a leer en primer lugar una cadena y luego una serie (%d significa número, como ya sabía de su printf

Eso es más o menos todo hay para eso. Su código es un poco peligroso, todavía, porque cualquier entrada de usuario que tenga más de 9 caracteres se desbordará en str y comenzará a pisotear su pila.

+0

Ahh muchas gracias! no me di cuenta que puedo hacerlo de esta manera. ¡Gracias! – user1420474

5

scanf("%s",str) explora solo hasta que encuentra un carácter de espacio en blanco. Con la entrada "A 1", escaneará solo el primer carácter, por lo tanto, s2 puntos en la basura que resultó estar en str, ya que esa matriz no se inicializó.

+0

Sí, me di cuenta de que si ingreso "ABCFS", no muestra basura. Ahora sé dónde está el problema. ¡Gracias! – user1420474

1

Prueba este código de mi amigo ...

#include<stdio.h> 
int main(){ 
    char *s1, *s2; 
    char str[10]; 

    printf("type a string: "); 
    scanf("%s", str); 

    s1 = &str[0]; 
    s2 = &str[2]; 

    printf("%c\n", *s1); //use %c instead of %s and *s1 which is the content of position 1 
    printf("%c\n", *s2); //use %c instead of %s and *s3 which is the content of position 1 

    return 0; 
}