5 votes

Comment puis-je obtenir automatiquement le premier caractère d'une chaactère constant comme un caractère constant?

Est-il possible de réécrire ce qui suit pour que je n'aie à modifier qu'un seul endroit si la chaîne change ?

#define MY_STRING "Foo bar"
#define MY_STRING_FIRST_CHAR 'F'

L'exemple suivant n'est pas acceptable car il se réfère à un caractère dans un emplacement mémoire, il ne peut donc pas être utilisé comme un cas dans une instruction switch :

#define MY_STRING_FIRST_CHAR MY_STRING[0]

switch (something) {
    case MY_STRING_FIRST_CHAR:
        break;
}

Le but est d'analyser efficacement une chaîne reçue en regardant un seul caractère. Dans mon cas, toutes les chaînes ont un caractère unique. Ce qui suit n'est pas mon code réel, mais un exemple très simple pour montrer le principe :

#define COMMAND_LIST              "list"
#define COMMAND_LIST_FIRST_CHAR   'l'
#define COMMAND_CHANGE            "change"
#define COMMAND_CHANGE_FIRST_CHAR 'c'
#define COMMAND_EXIT              "exit"
#define COMMAND_EXIT_FIRST_CHAR   'e'

switch(received_command_string[0]){
  case COMMAND_LIST_FIRST_CHAR:
    // Faire les actions "list"
    break;
  case COMMAND_CHANGE_FIRST_CHAR:
    // Faire les actions "change"
    break;
  case COMMAND_EXIT_FIRST_CHAR:
    // Faire les actions "exit"
    break;
}

L'utilisateur "pmg" a trouvé ceci dans la documentation de gcc : "Il n'y a pas de moyen de convertir un argument macro en une constante de caractère."

Je voulais que les définitions soient dans un fichier d'inclusion pouvant être partagé par plusieurs fichiers source. Voici la solution la plus proche que je puisse obtenir en ne définissant chaque caractère qu'à un seul endroit :

#include 
#define CH0 'F'
#define CH1 'o'
#define CH2 'o'
#define CH3 ' '
#define CH4 'b'
#define CH5 'a'
#define CH6 'r'
static char MY_STRING[] = { CH0, CH1, CH2, CH3, CH4, CH5, CH6, '\0'};
#define MY_STRING_PREMIER_CHAR CH0

void main(void){
  printf("La chaîne est %s, le premier caractère est %c\n", MY_STRING, MY_STRING_FIRST_CHAR);
}

Je ne le ferai pas de cette façon. La question initiale était de savoir s'il est possible de partager une définition pour obtenir à la fois une constante de chaîne et une constante de caractère. En gaspillant des cycles d'horloge au moment de l'exécution, il existe plusieurs solutions à mon problème.

3voto

pmg Points 52636

Vous pouvez le faire en écrivant chaque symbole une fois ... mais sur des définitions différentes

#include <stdio.h>

#define COMMAND_LIST_FIRST_CHAR   'l'
#define COMMAND_LIST              (char[]){ COMMAND_LIST_FIRST_CHAR, 'i', 's', 't', 0 }

int main(void) {
    char received_command_string[] = "list";
    switch (received_command_string[0]) {
        case COMMAND_LIST_FIRST_CHAR:
            printf("Faire les choses de \"list\" pour '%s'\n", COMMAND_LIST);
            break;
        default:
            break;
    }
    return 0;
}

1voto

greydet Points 2779

Pourquoi voulez-vous absolument utiliser un switch case?

Vous pourriez plutôt utiliser une table de correspondance qui relie votre chaîne de caractères et la fonction de traitement. Ensuite, il vous suffit d'itérer sur la table.

typedef struct {
    char * clé;
    void (*func)(void);
} MAP_ENTRY;

MAP_ENTRY map [] = {
    {"liste", listHandler},
    {"changer", changeHandler},
    {"quitter", exitHandler},
};

for (i = 0; i < sizeof(map)/sizeof(map[0]); i++) {
    if (map[i].clé[0] == received_command_string[0]) {
        map[i].func();
        break;
    }
}

Ensuite, il vous suffit de déplacer le code de traitement de votre switch/case dans la fonction de gestion correspondante

-4voto

Kirill Saidov Points 1
#définir MA_CHAINE "Bonjour"

const char var[] = MA_CHAINE;

switch(var[0]) {
    case 'H':
    break;
    case 'A':
    break;
}

Cela devrait le résoudre.

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