web-dev-qa-db-fra.com

Comment «imprimer» correctement un entier et une chaîne en C?

J'ai le code suivant:

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);

Lorsque j'exécute le code et saisis l'entrée "A 1" comme suit:

Type a string: A 1

J'ai obtenu le résultat suivant:

A
�<�

J'essaie de lire le premier caractère sous forme de chaîne et le troisième caractère sous forme d'entier, puis de les imprimer à l'écran. Le premier caractère fonctionne toujours, mais l'écran affichera simplement des éléments aléatoires après cela ... Comment dois-je le corriger?

17
user1420474

Vous êtes sur la bonne voie. Voici une version corrigée:

char str[10];
int n;

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

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

Parlons des changements:

  1. allouer un int (n) pour stocker votre numéro dans
  2. dire à scanf de lire d'abord une chaîne puis un nombre (%d signifie nombre, comme vous le saviez déjà grâce à votre printf

C'est à peu près tout ce qu'il y a à faire. Votre code est encore un peu dangereux, car toute entrée utilisateur de plus de 9 caractères débordera str et commencera à piétiner votre pile.

27
sblom

scanf("%s",str) scanne uniquement jusqu'à ce qu'il trouve un caractère d'espacement. Avec l'entrée "A 1", il n'analysera que le premier caractère, donc s2 pointe sur les ordures qui se trouvaient dans str, car ce tableau n'a pas été initialisé.

5
Daniel Fischer

Essayez ce code mon ami ...

#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;
}
1
Nirav Patel