2016-11-22 4 views
-8

J'ai un programme C qui lit à partir du clavier, comme ceci:Le C de l'équivalent de la chaîne de format C

scanf("%*[ \t\n]\"%[^A-Za-z]%[^\"]\"", ps1, ps2); 

Pour une meilleure compréhension de ce que cette instruction ne, Séparons la chaîne de format comme suit:

%*[ \t\n]\" => lire tous les espaces, les onglets et les nouvelles lignes ([ \t\n]) mais ne les stocker dans aucune variable (d'où le '*'), et continuera à lire jusqu'à rencontrer un double guillemet (\"), mais le double guillemet n'est pas entré .

Une fois que scanf() a trouvé la double citation, lit tous les caractères qui ne sont pas des lettres dans ps1. Ceci est accompli avec ...

%[^A-Za-z] => entrez n'importe quoi, pas une lettre majuscule 'A' à 'Z' et une lettre minuscule 'a' à 'z'.

%[^\"]\" => lire tous les caractères restants jusqu'à, mais sans inclure un guillemet dans ps2 ([^\"]) et la chaîne doit se terminer par un guillemet (\"), mais le guillemet n'est pas entrée.

que quelqu'un peut me montrer comment faire la même chose en C++

Merci

+0

Il semble que ce que j'ai dit n'est pas clair pour certaines personnes! 'cin existe en C++ pour prendre la place de scanf de C, sinon, nous n'avons pas besoin de' cin ',' cout 'et toutes les fonctionnalités C++ introduites. – user7140484

+0

@AndrewHenle, donc vous voulez dire que je ne peux pas lire de la console en respectant certaines restrictions! Est-ce que vous avez dit? Désolé mais je ne crois pas. – user7140484

+0

@ 0x5453 Je ne veux pas renvoyer scanf en C++. Je veux faire la même chose sans cstdio – user7140484

Répondre

3

C++ prend en charge la fonction scanf. Il n'y a pas d'alternative simple, surtout si vous voulez répliquer la sémantique exacte de scanf() avec tous les caprices.

Notez cependant que votre code a plusieurs questions:

  • Vous ne passez pas le nombre maximum de caractères à lire dans ps1 et ps2. Toute séquence d'entrée suffisante provoquera un débordement de tampon avec des conséquences désastreuses.

  • Vous pouvez simplifier le premier format %*[ \t\n] avec juste un espace dans la chaîne de format. Cela permettrait également le cas où aucun caractère d'espace n'est présent. Tel qu'actuellement écrit, scanf() échouerait et renverrait 0 si aucun caractère d'espace blanc n'était présent avant le ".

  • De même, si aucune lettre non ou si aucun autre caractère suivre avant la deuxième ", scanf renverrait un nombre court 0 ou 1 et laisser un ou deux choix de destination dans un état indéterminé.

Pour toutes ces raisons, il serait beaucoup plus sûr et prévisible en C pour lire d'abord une ligne d'entrée avec fgets() et utiliser sscanf() ou analyser la ligne à la main.

En C++, vous voulez absolument utiliser le package std::regex défini dans <regex.h>.