2010-07-07 5 views
4

Évidemment, je veux avoir "Fools 'day" dans b. Puis-je dire à sscanf() de ne pas considérer les apostrophes échappées comme la fin de la séquence de caractères?Est-ce que scanf/sscanf peut gérer les caractères échappés?

Merci!

+3

'\ 'est identique à' ''. Vous avez besoin de '\\ '. – kennytm

+0

Wow, c'est une communauté formidable (et rapide). Merci pour les réponses! –

+0

Vous pouvez également vérifier boost :: format. www.boost.org/doc/libs/release/libs/format/doc/format.html –

Répondre

8

Non. Ces fonctions lisent simplement les anciens caractères. Ils n'interprètent pas le contenu en fonction des règles d'échappement car il n'y a rien à échapper - les guillemets, les apostrophes et les barres obliques inverses ne sont pas spéciaux dans la chaîne d'entrée.

Vous devrez utiliser autre chose pour analyser votre chaîne. Vous pouvez écrire une petite machine d'état pour lire la chaîne un caractère à la fois, en gardant une trace si le caractère précédent était un antislash. (Ne vous contentez pas de passer à l'apostrophe suivante, puis regardez un caractère en arrière: si vous avez le droit d'échapper les barres obliques inverses et les apostrophes, vous pouvez revenir au début de la chaîne pour voir si vous avez un étrange ou même nombre de caractères d'échappement. toujours analyser les chaînes en avant, pas en arrière.)

0

Remplacer

char* a = " 'Fools\' day' "; 

avec

char* a = " 'Fools' day' "; 

Le caractère ' n'est pas spécial dans une chaîne C (bien qu'il soit spécial dans un seul char). Il n'y a donc pas besoin d'y échapper.

Aussi, si tout ce que vous voulez est "Fools 'day", pourquoi mettre les ' s supplémentaires au début et à la fin? Peut-être que vous confondez les chaînes C avec celles dans une autre langue? Comme le dit le commentaire de Rob Kennedy, je supposais que vous fournissiez la chaîne vous-même. Sinon, voir la réponse de Rob.

+1

Je pense qu'il est raisonnable de supposer que l'entrée de 'sscanf' ne sera pas * vraiment * issue d'un littéral de chaîne dans le programme . Plutôt, il sera lu d'ailleurs (comme un fichier, ou le clavier - demandant donc aussi 'scanf') et il contiendra une barre oblique inverse parce que l'apostrophe est spéciale au programme. Le programme veut lire une chaîne entre guillemets simples qui peut contenir des guillemets simples. –

+0

C'est vrai. Désolé, je vais essayer de me rendre plus clair dans la question suivante :) –

0

Pourquoi diable écrivez-vous une telle chose au lieu d'utiliser std :: string? Puisque votre question est marquée C++.

int main(int argc, char* argv[]) 
{ 
    std::string a = " 'Fools' day' "; 
    std::string b(a.begin() + 2, std::find(a.begin() + 2, a.end(), ' ')); 
    std::cout << b; 
    std::cin.get(); 
} 

Editer: Oh, attendez une seconde, vous voulez lire une chaîne dans une chaîne? Utilisez simplement des doubles guillemets échappés, par ex.

int main(int argc, char* argv[]) { 
    std::string a = " \"Fool's day\" "; 
    auto it = std::find(a.begin(), a.end(), '"'); 
    std::string b(it, std::find(it, a.end(), '"'); 
    std::cout << b; 
} 

Si l'utilisateur a mis la chaîne, ils ne devront pas échapper à des guillemets simples, bien qu'ils devraient échapper à des guillemets doubles, et vous auriez à faire votre propre système pour cela.

+0

Votre code ne met pas 'Fools 'Day' dans' b' non plus. –

+0

Changez donc +1 à +2. Gosh, c'était dur. – Puppy

+0

Hum, non, l'ajout de 1 n'aide pas. Cet appel à 'find' s'arrête au premier espace, donc vous stockez' Fools'' dans 'b'. Gosh. –

Questions connexes