OVH Cloud OVH Cloud

Position sous-chaine

133 réponses
Avatar
Francois Cartegnie
Hello,

Je cherche un moyen de connaitre la position d'une occurence dans une chaine


J'ai essayé :
temp = strstr(bufferspace, "truc");
taille = temp-bufferspace;
Ne fonctionne pas car temp peut prendre la valeur NULL et donc le
compilateur refuse.

Etant dans l'espace noyau, je n'ai accès qu'a des fonctions sortant un
pointeur, et non la position.

Cordialement,

10 réponses

Avatar
Laurent Deniau
Emmanuel Delahaye wrote:

#include <string.h>
#include <stdio.h>
#include <stddef.h>

int main(void)
{
char *a = "C'est quoi ce truc ?";
char unsigned *b;

b = strstr(a, "truc");

if (b != NULL)
{
ptrdiff_t size = b - a;

printf ("size =%dn", size);
}

return 0;
}

main.c:15: invalid operands to binary -

Effectivement il y a un problème. En gros ça signifie "opérandes invalides
dans le binaire". Ce n'est pas à proprement parler une erreur de compilation,


Ouarf. C'est une erreur sur les operandes de l'operateur binaire -. Rien a voir
avec le code binaire et c'est bien une erreur de compilation (cf mon autre
post). Erreur classique de croire qu'un signed char et un char sont la meme chose...

a+, ld.

--
[ Laurent Deniau -- Scientific Computing & Data Analysis ]
[ CERN -- European Center for Nuclear Research ]
[ - http://cern.ch/Laurent.Deniau ]
[ -- One becomes old when dreams become regrets -- ]

Avatar
Emmanuel Delahaye
In 'fr.comp.lang.c', Gabriel Dos Reis wrote:

Emmanuel a fait l'assertion (fausse) qu'il n'existe aucune synergie
entre les deux comités alors même qu'une simple visite sur le site du
comité de son choix lui aurait permit de ne pas louper l'occasion de
se taire.


Tu a suffisement dénoncé les divergences et incohérences entre les 2 comités
pour qu'on finisse par te croire. Mais j'ai sans doute tord d'écouter ce que
tu dis...

--
-ed- [remove YOURBRA before answering me]
The C-language FAQ: http://www.eskimo.com/~scs/C-faq/top.html
<blank line>
FAQ de f.c.l.c : http://www.isty-info.uvsq.fr/~rumeau/fclc/

Avatar
Gabriel Dos Reis
Emmanuel Delahaye writes:

| In 'fr.comp.lang.c', Gabriel Dos Reis
| wrote:
|
| > Inutile. Ton incompétance est aveuglante. Fais moi plaisir, relis:
| >
| > [#3] For subtraction, one of the following shall hold:
| >
| > -- both operands have arithmetic type;
| >
| > -- both operands are pointers to qualified or unqualified
| > versions of compatible object types; or
| >
| > -- the left operand is a pointer to an object type and the
| > right operand has integer type.
| >
| > (Decrementing is equivalent to subtracting 1.)
|
| Je comprends que pour la soustraction, une de ces trois conditions est
| requise:

Bien.

| -- Les deux opérandes ont un type arithmetique.
|
| pas de chance ce sont deux pointeurs, condition suivante:
|
| -- Les deux opérandes sont être de type pointeurs vers des objets
| compatibles, qualifiés ou non.
|
| C'est le cas de l'OP.

Bien

| Question, 'char *' est il compatible avec 'unsigned char *'?

Non.

| Pour moi,

pas de chance, ce n'est pas toi qui définis le C.

| oui, mais je veux bien qu'on me démontre le contraire.

C'est pour cela que j'ai pris soin de citer la norme. Voir plus haut.

-- Gaby
Avatar
Gabriel Dos Reis
Emmanuel Delahaye writes:

| In 'fr.comp.lang.c', Gabriel Dos Reis wrote:
|
| > Emmanuel a fait l'assertion (fausse) qu'il n'existe aucune synergie
| > entre les deux comités alors même qu'une simple visite sur le site du
| > comité de son choix lui aurait permit de ne pas louper l'occasion de
| > se taire.
|
| Tu a suffisement dénoncé les divergences et incohérences entre les 2 comités
| pour qu'on finisse par te croire.

Finir par me croire est différent d'affirmer

Il n'y a aucune synergie entre ces langages. Au contraire, la dernière
version du C montre des divergences plus nettes. Le seul point
commun est le préprocesseur.


Il au moins une _liaison officielle_ entre le comité C et le comité
C++ : Tom Plum. Les Plauger (ainsi que d'autres personnes) servent de
« communicants » entre les deux comités. Cela ne les empêche pas
chacun (i.e. comité) de concevoir des divergences -- notamment le
comité C.

-- Gaby
Avatar
Gabriel Dos Reis
Laurent Deniau writes:

[...]

| non ce n'est pas un bug. le code est un UB.

Mieux qu'un fonctionnement indéfini, c'est une violation d'une
contrainte explicite sans mention « no diagnostic is required ».

5.1.1.3 Diagnostics

[#1] A conforming implementation shall produce at least one
diagnostic message (identified in an implementation-defined
manner) if a preprocessing translation unit or translation
unit contains a violation of any syntax rule or constraint,
even if the behavior is also explicitly specified as
undefined or implementation-defined. Diagnostic messages
need not be produced in other circumstances.8)

-- Gaby
Avatar
Emmanuel Delahaye
In 'fr.comp.lang.c', Laurent Deniau wrote:

Ouarf. C'est une erreur sur les operandes de l'operateur binaire -. Rien
a voir avec le code binaire et c'est bien une erreur de compilation (cf
mon autre post). Erreur classique de croire qu'un signed char et un char
sont la meme chose...


En l'occurence, il s'agissait d'un unsigned char et d'un char...

--
-ed- [remove YOURBRA before answering me]
The C-language FAQ: http://www.eskimo.com/~scs/C-faq/top.html
<blank line>
FAQ de f.c.l.c : http://www.isty-info.uvsq.fr/~rumeau/fclc/

Avatar
Gabriel Dos Reis
"Jalico" writes:

| Là il semble que ce soit toi qui ne saches pas de quoi tu parles ...

Plus spécifiquement ?

-- Gaby
Avatar
Gabriel Dos Reis
Emmanuel Delahaye writes:


[...]

| main.c:15: invalid operands to binary -
|
| Effectivement il y a un problème. En gros ça signifie "opérandes invalides
| dans le binaire".

Ourf, tin tu devrais remplacer les séries B à la télé en ce moment.

« opérandes invalides pour - binaire ». Cela n'a rien à avoir avec le
binaire.

| Ce n'est pas à proprement parler une erreur de compilation,

si, c'en est une.

| mais plutôt de traduction de l'assembleur en binaire.

Faux.

-- Gaby
Avatar
Richard Delorme

Richard Delorme wrote:


Richard Delorme écrivait :


D'après la norme signed char et unsigned char ne sont pas des types
compatibles. Or la norme n'autorise la soustraction que de pointeur vers
des types compatibles. Ton compilateur a donc raison si char est signé.


Et mêm si char est non signé d'ailleurs.




En effet, char, signed char et unsigned char sont trois types différents.


oui mais signed char et unsigned char sont compatibles.


Je ne crois pas, cf §6.2.5, §6.2.7 et § 6.7.2. de la norme.

char est a part. sizeof(char) == 1 tandis que sizeof(signed char) = > sizeof(unsigned char) >= 1


Je ne crois pas non plus.

6.5.3.4 The sizeof operator
3. When applied to an operand that has type char, unsigned char, or signed
char (or a qualified version thereof) the result is 1.

--
Richard




Avatar
Serge Paccalin
Le mardi 5 août 2003 à 18:28, Gabriel Dos Reis a écrit dans
fr.comp.lang.c :

| Dans la norme du C, on a :
| 6.5.6
| 3 For subtraction, one of the following shall hold:
| -- both operands are pointers to qualified or unqualified versions of
| **compatible** object types;
|
| Dans la norme du C++ :
| 5.7
|
| 2 For subtraction, one of the following shall hold:
| -- both operands are pointers to cv-qualified or cv-unqualified versions
| of **the same completely defined** object type;

Et où est le probleme en ce qui concerne soustraire un 'char*' d'un
'unsigned char*' ?


Je reformule :

- Considères-tu que « char » et « unsigned char » sont des types
d'objets compatibles (au sens où la norme C comprend ce terme) ?

- Considères-tu que « char » et « unsigned char » sont le même type
d'objet complètement défini (au sens où la norme C++ comprend ces
termes) ?

À titre d'*exemple*, Visual Studio 6.0 répond « oui » puis « non ». Je
n'ai pas d'avis tranché sur ces questions, je tiens juste compte des
choix d'implantation faits dans l'outil que j'utilise tous les jours.

--
___________ 2003-08-06 08:39:09
_/ _ _`_`_`_) Serge PACCALIN -- sp ad mailclub.net
_L_) Il faut donc que les hommes commencent
-'(__) par n'être pas fanatiques pour mériter
_/___(_) la tolérance. -- Voltaire, 1763