6 votes

Impression d'un tableau avec des virgules de séparation

J'essaie d'imprimer les éléments d'un tableau séparés par des virgules.

Mon résultat :

5,6,7,8,9, 

Je dois me débarrasser de la dernière virgule, quelqu'un sait comment faire ?

#include <stdio.h>
#include <stdlib.h>

void print_array(int integers[], int  elements);

int main(){

    int arr[5] = {5, 6, 7, 8, 9};
    print_array(arr, 5);

    return 0;

}

void print_array(int integers[], int elements){

    int j; 
    for(j=0; j<elements; j++){
        printf("%d,", integers[j]);

    }
}

4voto

einpoklum Points 2893

Il s'agit en fait d'un modèle fréquent en programmation : Vous avez une séquence d'éléments, et vous voulez faire quelque chose à la fois pour chaque élément et pour chaque paire d'éléments consécutifs, c'est-à-dire pour chaque espace entre des éléments consécutifs.

Quoi qu'il en soit, voici quelques options :

  1. Interroger tous les éléments sauf le dernier (sachant qu'ils ont tous un élément suivant), traiter le dernier séparément.
  2. Traiter le premier élément séparément, puis itérer tous les éléments après le premier (sachant qu'ils ont tous un élément précédent).
  3. Itérer tous les éléments, mais vérifier si vous êtes à l'élément final.
  4. Interrogez tous les éléments, utilisez un booléen pour vous rappeler quand vous avez déjà dépassé le premier élément (c'est-à-dire que vous définissez le booléen quand vous trouvez qu'il est faux).
  5. Interroger tous les éléments, en agissant comme s'ils avaient tous un élément suivant, puis effectuer un correctif action pour annuler le travail sur la paire inexistante d'éléments subséquents à la fin.

Voici un exemple pour votre cas de la première option :

void print_array(int integers[], size_t num_elements)
{
    if (num_elements == 0) { return; }
    for(size_t j = 0; j < num_elements - 1; j++){
        printf("%d,", integers[j]);
    }
    printf("%d", integers[num_elements - 1]);
}

Notes :

  • Il est difficile d'éviter complètement la duplication du code avec ce modèle.
  • elements est un nom qui prête à confusion (il vous fait penser que cette variable contient les éléments réels), je l'ai remplacé par num_elements .
  • Une question similaire sur le C++ : Comment imprimer une liste d'éléments séparés par des virgules ?

3voto

chux Points 13185

Il est recommandé de changer le séparateur après l'impression.

void print_array(const int integers[], int elements) {
  const char *separator = ""; 
  for(int j=0; j<elements; j++) {
    printf("%s%d", separator, integers[j]);
    separator = ",";
  }
  printf("\n");
}

Remarquez que cela fonctionne bien même si elements == 0 et ne nécessite aucune if() blocs ou ?: déclarations.

1voto

d3L Points 2734

En développant l'idée d'einpoklum. réponse Voici comment je procéderais (option 3) :

#include <stdio.h>
#include <stdbool.h>

void print_array(int integers[], size_t num_elements) {
    for(size_t j = 0; j < num_elements; j++) {
        bool is_last_element = (j + 1) == num_elements;
        printf("%d", integers[j]);

        if (!is_last_element) {
            printf(",");
        }
    }
}

int main(void) {
    int ints[4] = {1,2,3,4};

    print_array(ints, 4);
}

Cela présente l'avantage de :

  • Nous n'avons pas besoin de vérifier les éléments zéro.
  • La variable de comptage j reste locale à la boucle for (ceci est sans doute mineur mais c'est toujours un plus)
  • Pas de duplication de code

0voto

pmg Points 52636

Ce que je fais habituellement est d'imprimer le premier élément spécial en évitant un if à l'intérieur de la boucle

void print_array(const int *integers, size_t elements, const char *pref, const char *postf) {
    if (pref) printf("%s", pref);
    printf("%d", integers[0]);              // 1st element
    for (size_t j = 1; j < elements; j++) {
        printf(", %d", integers[j]);        // 2nd, 3rd, ... elements
    }
    if (postf) printf("%s", postf);
}

int main(void) {
    int arr[5] = {5, 6, 7, 8, 9};
    print_array(arr, 5, 0, 0);
    print_array(arr, 5, "arr is {", "}\n");
    return 0;
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X