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

2 réponses

  1. ElementW Messages postés 5690 Statut Contributeur 1 293
     
    '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
    1. fiddy Messages postés 441 Date d'inscription   Statut Contributeur Dernière intervention   1 847
       
      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
      1. ElementW Messages postés 5690 Statut Contributeur 1 293 > fiddy Messages postés 441 Date d'inscription   Statut Contributeur Dernière intervention  
         
        Oups, j'ai mélangé avec une déclaration normale... Effectivement ça revient au même.
        0
  2. fiddy Messages postés 441 Date d'inscription   Statut Contributeur Dernière intervention   1 847
     
    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
    1. [Dal] Messages postés 6122 Date d'inscription   Statut Contributeur Dernière intervention   1 108
       
      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
    2. fiddy Messages postés 441 Date d'inscription   Statut Contributeur Dernière intervention   1 847
       
      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
    3. [Dal] Messages postés 6122 Date d'inscription   Statut Contributeur Dernière intervention   1 108
       
      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