Question

J'ai récemment écrit des programmes de ligne de commande de base (je veux garder mes compétences pointues pendant l'été), mais printf et scanf avons commencé à me agacer. Je ne suis pas un programmeur merveilleux C, et d'avoir à entrer dans printf / scanf et leurs (ou encore instabilités pire, fgets et leurs semblables) ne me mettre exactement dans un cadre réconfortant (pour cette raison exactement, j'aime NSLog, avec son espace de noms par défaut réconfortante et son analyse syntaxique automatique NSString et NSObject).

À ma grande déception, cependant, NSLog ne dispose pas d'une fonction de contrepartie, et imprime beaucoup de « junk » supplémentaire (heure, nom de fonction, etc., avec un saut de ligne à la fin), ce qui contrecarre beaucoup de l'objet dans mon utilisation. J'ai donc décidé de s'asseoir pour un autre type de fonctions d'exercice et d'écriture programmation pour remplacer printf et scanf qui répondrait à mes besoins.

Et le tour est joué, je suis venu avec mon propre fichier NSInput.h, contenant deux fonctions: NSPrint() et NSScan(). Ces deux fonctions sont modélisés bien après printf et scanf, mais également gérer NSString de. Je sais que je suis fouler namespace sacré ici, mais je ne pouvais pas résister (IFPrint et IFScan son tout simplement terrible!).

Maintenant, alors que je suis vraiment heureux que je travaille code (pour lequel vous pouvez trouver la source ici ), je sais que ce n'est pas efficace (à ma grande surprise, cependant, NSPrint est plusieurs fois plus efficace que printf sous LLDB dans Xcode 4, mais qui est à côté du point). J'ai besoin de conseils sur la façon d'améliorer les fonctions, et plus efficace. NSScan, par exemple, convertit le va_list qu'il reçoit en un NSPointerArray, et les utilisations de NSScanner pour parcourir les chaînes de format et d'entrée, donc je sais qu'il ya beaucoup de place à l'amélioration.

En gros, ce que je veux savoir, ce qu'il ya des erreurs criantes je fait qui pourrait et devrait être fixé? Y at-il énorme que je manqué? Au cas où je viens d'appeler gâté et revenir à l'utilisation printf et scanf? S'il vous plaît dites-moi, je suis à la recherche d'entrée ici (jeu de mots ne sont pas destinés!) ...

Merci à l'avance!

Était-ce utile?

La solution

Mes pensées:

  • Ne pas les appeler nsXXXXX, NS est réservé pour le cacao et la Fondation.
  • Les deux fonctions devrait être modifié pour accepter un FILE* dire que vous devriez être la modélisation de l'interface fprintf() et fscanf() pour plus de flexibilité.
  • Votre fonction printf serait probablement mieux si vous avez utilisé fputs()

par exemple.

void NSFPrint (FILE* fp, NSString *format, ...) 
{
    // Create the variable argument list.
    va_list args;
    va_start(args, format);

    // Using NSString, parse the argument list and convert it to a C string.
    fputs([[[[NSString alloc] initWithFormat:format arguments:args] autorelease] UTF8String], fp);
     va_end(args);
}
  • Considérons l'ajout du support pour l'entrée et la sortie dans les codages autres que UTF-8.
  • Vos mélanges de remplacement scanf C et Unix IO tamponne UNBUFFERED IO sur stdin. Cela pourrait être mauvais.
  • Votre remplacement de scanf lit jusqu'à la fin de la ligne même quand il n'a pas besoin de. Je n'ai pas vérifié avec soin, mais si le format de numérisation ne consomme pas toute la ligne, il semble que vous défausser une carte d'entrée. Cela pourrait être mauvais.
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top