Chaine de caractère case vide

Fermé
Naji_El_khomssi Messages postés 12 Date d'inscription dimanche 4 janvier 2015 Statut Membre Dernière intervention 22 avril 2016 - Modifié par Naji_El_khomssi le 12/01/2015 à 18:56
[Dal] Messages postés 6194 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 11 octobre 2024 - 19 janv. 2015 à 15:22
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
A voir également:

2 réponses

ElementW Messages postés 4816 Date d'inscription dimanche 12 juin 2011 Statut Contributeur Dernière intervention 5 octobre 2021 1 228
Modifié par gravgun le 12/01/2015 à 19:54
'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 du
main()
.

Il manque un
return 0;
a la fin du
main()
.

taille(int T[100])

Il manque un spécificateur de type de retour, et bien qu'implicitement assumé comme étant un
int
(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 que
T
de
main()
):
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 un
else
et un
break
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
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 841
12 janv. 2015 à 22:57
int T[100]

, qui créé un nouveau tableau inutilement,

Non, ça ne créé rien du tout puisque c'est en argument. Que tu mettes ici int T[100], int T[] ou int *T ne changera rien...
0
ElementW Messages postés 4816 Date d'inscription dimanche 12 juin 2011 Statut Contributeur Dernière intervention 5 octobre 2021 1 228 > fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022
12 janv. 2015 à 22:58
Oups, j'ai mélangé avec une déclaration normale... Effectivement ça revient au même.
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 841
12 janv. 2015 à 23:00
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,
0
[Dal] Messages postés 6194 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 11 octobre 2024 1 092
Modifié par [Dal] le 13/01/2015 à 10:33
for
est bien, il permet d'initialiser i à 0, de tester si T[i] est égal à '\0' et d'incrémenter i tant qu'il ne l'est pas, on peut donc faire :

    for (i = 0; T[i]; i++)
    ; 
return i ;


Dal
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 841
13 janv. 2015 à 11:02
Cela est une question de préférence. Pour ma part, dans ce genre de contexte, je préfère largement l'utilisation du while.

Mais mon message n'était pas contre l'utilisation de la boucle for, mais contre l'utilisation du break...
0
[Dal] Messages postés 6194 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 11 octobre 2024 1 092
19 janv. 2015 à 15:22
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 que
while
me vient aussi plus naturellement dans ces cas, et il a sans doutes une meilleure lisibilité.

Dal
0