c inverse de strstr

a marqué ce sujet comme résolu.

Bonjour, je bloque sur un point, pour séparer une chaine de caractere j’utilise la fonction strstr par exemple dans mon cas j’ai cette chaine machaine :

1
ma_data=ma_valeur

pour récuperer "ma_valeur" j’utilise ce code :

1
2
result = strstr((char *)machaine,"=");
result = result + strlen("=");

ce qui me retourne

1
ma_valeur

mais je voudrais aussi récuperer "ma_data", comment faire ? peut on faire donc l’inverse strlen et récuperer l’inverse de ma sous chaîne ?

La fonction strchr suffirait.

Faire une copie (à moins de pouvoir modifier la chaîne de départ et que ce soit souhaitable) et modifier le '=' en '\0'.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
char *equal, *copy;

if (NULL == (copy = strdup(result))) {
    // erreur
}
if (NULL == (equal = strchr(copy, '='))) {
    // pas de caractère '=' dans la chaîne result
} else {
    *equal = '\0';
    // ici en copy, tu as "ma_data" et en equal + 1 "ma_valeur"
    printf(">%s< = >%s<\n", copy, equal + 1);
}
//free(copy);

Autre solution, garder la longueur (position du '=' - début de result) devant le '=', mais ça dépend ce que tu en fais/comment l’utilises ensuite :

1
2
3
4
5
6
7
char *equal;

if (NULL == (equal = strchr(result, '='))) {
    // pas de caractère '=' dans la chaîne result
} else {
    printf(">%.*s< = >%s<\n", equal - result, result, equal + 1);
}

Mais ça implique de travailler ensuite avec des fonctions qui attendent la longueur de la chaîne (modificateur %.*s des fonctions *printf, les mem* voire les strn*, etc), pas celles qui se basent sur le \0 de fin (les fonctions str* "traditionnelles" notamment).

+1 -0

merci pour ta réponse, mais j’ai pas compris ce qu’étais la variable *p (et "p + 1") si je fais un puts(copy) j’ai bien par contre "=ma_valeur" .

edit: tu a édité ton message, j’ai compris *p c’étais la variable equal merci ta solution fonctionne !

+0 -0

Désolé, j’ai renommé ma variable en cours de route (p c’est equal) sans adapter partout.

*equal = '\0' c’est pour tronquer la chaîne, enfin, la diviser en deux plutôt ici. On remplace le caractère '=' par '\0'.

equal + 1, vu que equal pointera sur le caractère (initial) '=', désigne la sous-chaîne située après le '=' (ta valeur) :

1
2
3
4
5
6
+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+----+
| m | a | _ | d | a | t | a | = | m | a | _ | v | a | l | e | u | r | \0 |
+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+----+
  ^ result
                              ^ equal
                                  ^ equal + 1
+0 -0

Salut,

À noter qu’il existe également la fonction strtok() (elle est présentée dans le tuto C là-bas /!\ ce lien est temporaire). Attention toutefois qu’elle requiert de pouvoir modifier la chaîne fournie en argument.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
#include <stdio.h>
#include <string.h>


int
main(void)
{
        char s[] = "ma_data=ma_valeur";

        (void)strtok(s, "=");
        puts(s);
        return 0;
}

La conversion vers le type void est juste là pour éviter un avertissement du compilateur.

+0 -0

En fait il veut récupérer les deux valeurs, donc il faudra une copie des deux résultats. Une autre proposition avec des opérations sur les adresses.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
#include <stdio.h>
#include <string.h>

int main(void){

        char s[] = "ma_data=ma_valeur";
        char b1[32], b2[32];

        char *q = s;
        char *p = strchr(s, '=');

        strncpy(b1, s, p-q); /* copie de la 1ère partie */
        strcpy(b2, p+1); /* copie de la 2ème partie */

        b1[p-q] = '\0';

        puts(b1);
        puts(b2);

        return 0;
}
+0 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte