Chaine de caractère case vide
Naji_El_khomssi
Messages postés
13
Statut
Membre
-
[Dal] Messages postés 6122 Date d'inscription Statut Contributeur Dernière intervention -
[Dal] Messages postés 6122 Date d'inscription Statut Contributeur Dernière intervention -
Bonjour, s'il vous plait pouvez vous me corriger ce programme ?
#include <stdio.h>
#include <stdlib.h>
int main ()
{
char T[100];
printf ("Saisissez votre chaine de caracteres: \n");
scanf ("%s",&T);
printf ("Le nombre de caracteres dand votre chaine est: %d",taille(T));
}
taille(int T[100]){
int t=0;
int i;
for (i=0;i<100;i+=1)
if (T[i] != 0)
t=t+1;
return t;}
et merci d'avance
#include <stdio.h>
#include <stdlib.h>
int main ()
{
char T[100];
printf ("Saisissez votre chaine de caracteres: \n");
scanf ("%s",&T);
printf ("Le nombre de caracteres dand votre chaine est: %d",taille(T));
}
taille(int T[100]){
int t=0;
int i;
for (i=0;i<100;i+=1)
if (T[i] != 0)
t=t+1;
return t;}
et merci d'avance
2 réponses
-
'lut, premièrement l'indentation est absente, il est très recommandé d'en mettre si tu comptes lire plus facilement ton programme.
Ensuite:scanf ("%s",&T);T étant un tableau, c'est déjà un pointeur vers la zone mémoire voulue, donc pas de&
a mettre devant.
taille(T)
tu appelles taille() avant l'avoir déclaré ou défini; déplace toute la fonction au dessus dumain()
.
Il manque unreturn 0;
a la fin dumain()
.
taille(int T[100])
Il manque un spécificateur de type de retour, et bien qu'implicitement assumé comme étant unint
(ce que tu veux ici), il faut le préciser.int T[100]
, qui créé un nouveau tableau inutilement, est a remplacer par un pointeur du bon type (i.e. le même queT
demain()
):char *T
.
for (i=0;i<100;i+=1) if (T[i] != 0) t=t+1;
Ta boucle ne s'arrête pas quand elle rencontre un'\0'
, elle ne compte juste pas le caractère. Or rien ne garantis que T est remplie de 0 au départ, donc des caractères après peuvent être comptés par erreur.
Ajoute unelse
et unbreak
pour casser la boucle si le caractère est 0:for (i=0;i<100;i+=1) if (T[i] != 0) t=t+1; else break;
from human import idiocy
del idiocy -
2 remarques en plus de ce que gravgun a dit :
1/ N'oublie pas de mettre un '\n' à la fin de ton dernier printf().
2/ Plutôt que faire un for / if / else /break qui n'est pas super clean, je te conseille un :i=0; while (T[i] != '\0') { i++; } return i;
Cdlt,-
-
-
Oui, j'avais compris. Mon propos était d'attirer l'attention sur le fait que l'on peut exploiter ce que sait faire l'instruction
for
dans les parenthèses, au point de pouvoir se passer d'accolades dans ce cas particulier. Ainsi, au final, l'algorithme que proposait de mettre gravgun dans les accolades peut se trouver seulement dans les parenthèses.
Je te rejoins sur le fait quewhile
me vient aussi plus naturellement dans ces cas, et il a sans doutes une meilleure lisibilité.
Dal
-