/ / Comment faire en sorte que sscanf démarre l'analyse après l'exécution en C? - c, scanf

Comment faire pour que sscanf commence à scanner après rnrn dans C? - c, scanf

J'écris un client / serveur HTTP en C et je veuxpour lire le contenu (pas l'en-tête http) dans une chaîne. Comme la dernière chose dans l'en-tête est une séquence rnrn, j'ai besoin de dire à sccanf de tout ignorer jusqu'à rnrn, puis de commencer à balayer à la première chaîne après rnrn. Je n'ai jamais vraiment compris les descripteurs complexes de formats printf et scanf, et chaque fois que j'essaie de lire la documentation, je me trompe rapidement. Mon meilleur essai a été sscanf(str, [^rnrn]%s, mystr); Mais ça ne fonctionne pas.

Réponses:

0 pour la réponse № 1

la syntaxe de scanf est à peu près la même que celle de printf. Par conséquent, ce que vous voulez utiliser est:

sscanf(str, "%srnrn%s", dummystr, mystr);

Bien sûr, vous devez allouer dummystr et mystr de manière à ce qu'ils évitent les débordements de mémoire tampon (strlen (str) convient aux deux).


0 pour la réponse № 2

Quelque chose comme ça:

#include <stdio.h>

int main()
{
char const* testString = "abcdrnrnthe rest";
char str[20] = {};
sscanf(testString, "%*[^rn]%*[r]%*[n]%*[r]%*[n]%[^n]", str);
printf("%sn", str);
}

Sortie:

the rest

Explication de la chaîne de format:

"%*[^rn]%*[r]%*[n]%*[r]%*[n]%[^n]"
|<-   ->| Read and discard everything that is not a n or r

"%*[^rn]%*[r]%*[n]%*[r]%*[n]%[^n]"
|<-->| Read and discard the first r

"%*[^rn]%*[r]%*[n]%*[r]%*[n]%[^n]"
|<-->| Read and discard the first n

"%*[^rn]%*[r]%*[n]%*[r]%*[n]%[^n]"
|<-->| Read and discard the second r

"%*[^rn]%*[r]%*[n]%*[r]%*[n]%[^n]"
|<-->| Read and discard the second n

"%*[^rn]%*[r]%*[n]%*[r]%*[n]%[^n]"
|<-->| Read and save all the characters until the next n

0 pour la réponse № 3

Peut-être une approche différente avec une machine à états

const char *rnrn(const char *s) {
const char *pat = "rnrn";
int ch;
int i = 0;
while (i<4) {
ch = *s++;
if (ch == "") return NULL;
if (ch == pat[i]) i++;
else if (ch == pat[0]) i = 1;
else i = 0;
}
// Success ....
return s;
}