Forcer une fonction à retourner si false

Comment créer une boucle qui remonte au début? Mon problème est ici:

int main(void) { midi_start(); program_change(1, 1); program_change(2, 1); t=400; printf("Choose a scale and write the code of it:\n "); printf("C:0\n "); printf("C#:1\n "); printf("D:2\n "); printf("D#:3\n "); printf("E:4\n "); printf("F:5\n "); printf("F#:6\n "); printf("G:7\n "); printf("G#:8\n "); printf("A:9\n "); printf("A#:10\n "); printf("B:11\n "); printf("The chosen key is:\n"); scanf("%d",&kk); k = kk + 60; if (kk >= 12) { printf("Go back to the start."); return main; } 

Je veux le faire revenir à la commande “S’il vous plaît, choisissez une clé” afin que la personne qui l’utilise puisse corriger l’erreur.

Utilisez une boucle do / while (d’autres types de boucles fonctionneraient également).

 do { printf("The chosen key is:\n"); scanf("%d",&kk); k = kk + 60; if (kk >= 12) printf("Go back to the start."); } while (kk >= 12); 

Une autre façon de structurer cette boucle consiste à break une break lorsque l’entrée est valide. Cela évite d’avoir à écrire deux fois la condition de sortie.

 for (;;) { puts("Enter scale: C, C#, D, D#, E, F, F#, G, G#, A, A#, B"); kk = get_scale(); if (kk == -2) { perror("stdin"); exit(1); } if (kk >= 0 && kk <= 11) break; puts("?Redo from start"); } 

Incidemment, obliger l'utilisateur à saisir un code numérique pour choisir une gamme musicale est extrêmement médiocre. Il n'y a aucune raison pour que votre programme ne puisse pas accepter "C" et convertir cela en "0" en interne; et, d’autre part, il devrait accepter «a♯» et «b ♭» comme la même chose que «A #».

 struct scale_code { unsigned short code; const char scale[6]; }; /* This table is sorted UTF8betically by the 'scale' field to permit binary search. */ static const struct scale_code scale_codes[] = { { 9, "A" }, { 10, "A#" }, { 8, "A♭" }, { 10, "A♯" }, { 11, "B" }, { 10, "B♭" }, { 0, "C" }, // ... { 7, "g" }, { 8, "g#" }, { 6, "g♭" }, { 8, "g♯" }, }; static int scale_code_compar(const void *k, const void *v) { return strcmp((const char *)k, ((const struct scale_code *)v)->scale); } static int get_scale(void) { static char *lineptr = 0; static size_t linealloc = 0; ssize_t count = getline(&lineptr, &linealloc, stdin); if (count <= 0) return -2; /* read error */ /* Valid input can be no fewer than 2 UTF-8 bytes, and no more than 6, and should end with a \n. */ if (count < 2 || count > 6) return -1; if (lineptr[count-1] != '\n') return -1; /* chomp */ lineptr[count-1] = '\0'; const struct scale_code *entry = bsearch(lineptr, scale_codes, sizeof(scale_codes)/sizeof(scale_code), sizeof(scale_code), scale_code_compar); if (!entry) return -1; return entry->code; } 

Exercice: écrivez un programme pour générer la table scale_codes au moment de la construction.