Comment interpréter les caractères spéciaux dans les arguments de ligne de commande en C?

Premier problème:

Supposons que nous écrivions un programme simple qui prenne en compte des arguments en ligne de commande et imprime dans un fichier. Si l’utilisateur entre

Writetofile Bonjour! 0 \ nw% orl \ t! @ # y

bash répond avec

! 0: événement non trouvé.

Sans que l’utilisateur sache comment utiliser des guillemets (”) ou des caractères d’échappement (‘\’), comment puis-je gérer ces éléments au lieu de les comprendre comme une commande?

Deuxième problème:

Une fois ces arguments obtenus, comment les interpréter comme des caractères spéciaux et non comme des séquences de caractères. (ie. \ t est une tabulation, pas ‘\’ ‘t’)

En d’autres termes, comment s’assurer que le programme écrit ceci dans le fichier:

Hello!0 w%orl !@#y 

et pas

 Hello!0\nw%orl\t!@#y 

Concernant le deuxième problème: comme @Jims l’a dit, vous pouvez utiliser printf (1) pour imprimer la chaîne. Bonne idée, mais sachez que cela ne fonctionnerait que parce que les échappements que vous voulez (apparemment) vouloir reconnaître, comme \t et \n , sont identiques à ceux reconnus par printf.

Ces échappées sont courantes, mais elles n’ont rien de fondamental. La réponse générale à votre question – et la réponse si vous souhaitez reconnaître une évasion que printf ne reconnaît pas – consiste à ce que votre programme les interprète. Le code de type C à faire serait quelque chose comme:

 char *arg = "foo\\tbar\\n"; /* the doubled backslashes are to make this valid C */ int arglen = strlen(arg); for (i=0; i 

(insérez erreur de manipulation et bon style, à votre goût).

Vous ne pouvez pas obtenir que bash arrête d’parsingr une ligne de commande en tant que ligne de commande. Dans votre cas particulier, set +H désactiverait le développement de l’historique, autorisant ainsi! 0 en tant que littéral, mais une commande échouerait quand même si vous incluiez (parenthesis) , $variables , #comments , ampersand & douzaine d’autres éléments de la syntaxe .

Notez que cela ne s’applique qu’à l’étape d’parsing du shell, pas aux données transmises littéralement à execve ou similaire.

Demandez à l’utilisateur de citer les données (les 'single quotes' s’occupent de tout sauf des guillemets simples), ou demandez à votre programme de lire les données lui-même pour que l’interaction se déroule

 $ writetofile Please enter your gibberish and press enter: Hello!0\nw%orl\t!@#y Thank you for your eloquent consortingbution. $ 

Premier problème: utilisez des guillemets simples. c’est-à-dire: Writetofile ‘Bonjour! 0 \ nw% orl \ t! @ @ # y’

Deuxième problème: utilisez printf.