Programma di esempio:

#include <stdio.h>
#include <string.h>
#define NUMERO_DELLE_STRINGHE 3
#define LUNGHEZZA_STRINGA_MAGGIORE 9

void funzioneQuadrato();
void funzioneCubo();

int main() {

    char comandi[NUMERO_DELLE_STRINGHE][LUNGHEZZA_STRINGA_MAGGIORE] = {"quadrato", "cubo", "esci"};
    char comandoUtente[LUNGHEZZA_STRINGA_MAGGIORE]; /*vettore per immagazzinare il comando inserito dall'utente*/
    int nComando; /*identificatore del comando scelto*/
    int i; /*contatore necessario per il confronto tra la stringa dell'utente e quelle del programma*/
    int uscita = 0; /*quando è uguale a 1 vuol dire che è stata inserita la stringa "esci", che termina l'esecuzione*/

do {
    do {
        nComando = 0; /*i due elementi vengono inizializzati per le scelte dei successivi cicli*/
        i = 0;
        printf("nInserire un comando: ");
        scanf ("%s", &comandoUtente);

        for(nComando = 0, i = 0; i < NUMERO_DELLE_STRINGHE; i++){
                if(strcmp(comandoUtente, comandi[i]) == 0) /*se il confronto fra il comando inserito e un comando del programma è positivo...*/
                    nComando = i + 1; /*...l'identificatore è uguale (per semplificare) alla posizione del comando nella matrice più uno*/
                    else 
                    printf("La stringa inserita non corrisponde al comando "%s".n", comandi[i]);
                
        } /*fine del comando while per il confronto delle stringhe*/
    } while(nComando == 0); /*continua a richiedere l'inserimento della stringa fino a quando non c'è una corrispondenza*/

    switch(nComando) { /*in questo switch è come se l'utente avesse inserito un numero per scegliere un'opzione*/
        case 1:
                funzioneQuadrato();
                    break;

            case 2:
                funzioneCubo();
                break;

            case 3:
                uscita = 1;
                    break;
    } /*fine del comando switch*/
} while(uscita == 0); /*il programma continuerà fino a quando non verrà inserito il comando "esci"*/
} /*fine della funzione main*/

void funzioneQuadrato() {
    int n;
    int quad;

    printf("Inserisci un intero: ");
    scanf ("%d", &n);
    quad = n * n;
    printf("Quadrato di %d = %dn", n, quad);
}

void funzioneCubo() {
    int n;
    int cubo;

    printf("Inserisci un intero: ");
    scanf ("%d", &n);
    cubo = n * n * n;
    printf("Cubo di %d = %dn", n, cubo);
}

Analizziamo il codice:
La funzione che verrà utilizzata strcmp è contenuta nella libreria standard string.h, che va inclusa:
#include <string.h>


Sono poi necessari:
- una matrice che contenga i comandi utilizzabili
- un vettore (o array) che conterrà il comando inserito dall'utente
- un intero che identifichi il comando scelto con un valore numerico
- un intero che svolga il compito di contatore per il confronto fra le stringhe
- un intero che diventa uguale a 1 all'inserimento del comando per uscire
char comandi[NUMERO_DELLE_STRINGHE][LUNGHEZZA_STRINGA_MAGGIORE] = {"quadrato", "cubo", "esci"};
    char comandoUtente[LUNGHEZZA_STRINGA_MAGGIORE];
    int nComando;
    int i;
    int uscita = 0;


Si passa quindi al confronto, con la funzione strcmp che restituisce 0 se le stringhe sono uguali; -1 se la prima è, in ordine alfabetico, minore; 1 se lo è la seconda.
Un ciclo permetterà il confronto fino a quando non ci sarà una corrispondenza, a quel punto viene assegnato un valore a nComando:
while(nComando == 0 && i < NUMERO_DELLE_STRINGHE){
                if(strcmp(comandoUtente, comandi[i]) == 0)
                    nComando = i + 1;
                    else {
                    printf("La stringa inserita non corrisponde al comando "%s".n", comandi[i]);
                            i++;
                }
        }


Ora abbiamo un intero che identifica il comando inserito: 1 per il comando "quadrato", 2 per il comando "cubo", 3 per il comando "esci"; adesso è come se la scelta dell'utente fosse effettuata con l'inserimento di un numero, usiamo uno switch per richiamare i comandi adatti alla scelta:
switch(nComando) {
    case 1:
        funzioneQuadrato();
        break;

    case 2:
        funzioneCubo();
        break;

    case 3:
        uscita = 1;
        break;

    }

I primi due case richiamano rispettivamente le funzioni funzioneQuadrato e funzioneCubo, il terzo modifica il valore uscita e il programma termina il ciclo principale.
Ricordatevi che il C è case sensitive, se un comando si chiama quadrato, non si può inserire QUADRATO.

Questa tipologia di menù si può usare in molte situazioni e a volte è meglio di quella con la richiesta dell'inserimento di un valore per la scelta di un'opzione.