2 votes

Tokeniser une chaîne de caractères C

Bonjour, j'ai des problèmes avec une fonction qui reçoit une chaîne de caractères d'un client dans le format "nombre op nombre" ,op étant un (+,-.*,/), puis retourne une réponse au client. J'ai besoin d'aide pour diviser la chaîne en deux variables num et une variable op.

Voici la fonction en question.

void func(int sockfd)
{
    char buff[MAX];
    int n, i, size, j;
    while (1) {
        bzero(buff, MAX);
        // read the message from client and copy it in buffer
        read(sockfd, buff, sizeof(buff));

        long int num1, num2, op;
        char temp[256];
        strcpy(temp, buff);
        sscanf(buff, "%s %s %s", num1, op, num2);

        // print buffer which contains the client contents
        printf("From client: %ld | | %ld", num1, num2);

4voto

Barmar Points 135986

Le format correct pour lire un long int es %ld , %s est pour les cordes.

Vous devez & avant que toute variable ne soit lue avec scanf() sauf pour les chaînes de caractères (puisque les tableaux se transforment automatiquement en pointeurs lorsqu'ils sont utilisés comme arguments de fonction).

op devrait être char plutôt que long int et vous devriez utiliser %c pour le lire.

Vous devez limiter la taille des read() à sizeof buff - 1 donc il y aura toujours un octet nul après le message qui a été lu.

Il n'y a pas besoin de la temp vous pouvez simplement balayer de buff .

Vous devez vérifier la valeur de retour de read() pour savoir si la connexion a été fermée.

void func(int sockfd)
{
    char buff[MAX];
    int n, i, size, j;
    while (1) {
        bzero(buff, MAX);
        // read the message from client and copy it in buffer
        int n = read(sockfd, buff, sizeof(buff));
        if (n == 0) { // EOF
            break;
        } else if (n < 0) {
            perror("read");
            break;
        }

        long int num1, num2;
        char op;
        sscanf(temp, "%ld %c %ld", &num1, &op, &num2);

        // print buffer which contains the client contents
        printf("From client: %ld | %c | %ld\n", num1, op, num2);
    }
}

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