Bonjour,

J'ai créé une fonction dédiée à la saisie de chaînes de caractères en console, mais il y a quelque chose que je ne comprends pas : le sizeof dans la fonction renvoie 8 alors que la chaîne est un tableau de 16 caractères.
Par conséquent, je ne peux pas saisir plus de 7 caractères, alors que cette limite devrait être de 15.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
 
void lire_chaine(char[], char[]);
 
int main()
{
	char nom[16];
 
	do
	{
		lire_chaine(nom, "Votre nom : ");
		printf(">> %s\n", nom);
	} while (nom[0] != '*');
 
	return 0;
}
 
void lire_chaine(char chaine[], char prompt[])
{
	char *p_nl = NULL;
 
	printf("-> %ld\n", sizeof chaine); /* pourquoi le sizeof est de 8 ?! */
 
	printf(prompt);
	fgets(chaine, sizeof chaine, stdin);
 
	p_nl = strchr(chaine, '\n');
	if (p_nl == NULL)
		while (getchar() != '\n');
	else
		*p_nl = '\0';
}
J'ai alors modifié mon code de manière à passer le sizeof directement en paramètre, et maintenant la fonction a le comportement attendu :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
void lire_chaine(char chaine[], size_t taille, char prompt[])
{
	char *p_nl = NULL;
 
	printf(prompt);
	fgets(chaine, taille, stdin);
 
	p_nl = strchr(chaine, '\n');
	if (p_nl == NULL)
		while (getchar() != '\n');
	else
		*p_nl = '\0';
}
Que j'appelle avec :
lire_chaine(nom, sizeof nom, "Votre nom : ");

Problème résolu, mais pourquoi mon premier essai ne marche pas ?
Que le sizeof se fasse dans le main ou dans lire_chaine, l'adresse de la chaîne nom est toujours la même, alors d'où vient ce 8 ?

Merci !