Maison  >  Article  >  développement back-end  >  Pourquoi la fonction C system() échoue-t-elle lorsque les paramètres contiennent des espaces ?

Pourquoi la fonction C system() échoue-t-elle lorsque les paramètres contiennent des espaces ?

Barbara Streisand
Barbara Streisandoriginal
2024-10-28 06:34:02472parcourir

Why does the C   system() function fail when parameters contain spaces?

Dysfonctionnements de la fonction C system() en raison d'espaces dans les paramètres

Lors de l'utilisation de la fonction system() en C pour exécuter un programme avec des paramètres contenant des espaces, cela peut entraîner une erreur concernant la syntaxe incorrecte du nom de fichier, du nom de répertoire ou du nom de volume. Ce problème survient lorsque le chemin de l'exécutable et le chemin du fichier de paramètres contiennent des espaces.

Par exemple :

<code class="cpp">#include <stdlib.h>
#include <conio.h>

int main() {
    system("\"C:\Users\Adam\Desktop\pdftotext\" -layout \"C:\Users\Adam\Desktop\week 4.pdf\"");
    _getch();
}</code>

Dans ce code, la fonction system() tente d'exécuter le "pdftotext" exécutable avec deux paramètres. Cependant, la présence d'espaces à la fois dans le chemin de l'exécutable et dans le chemin des paramètres déclenche l'erreur.

Cause du problème

La fonction system() transmet ses arguments à la commande cmd /k, qui interprète les arguments selon des règles précises. L'une de ces règles stipule que si la ligne de commande contient exactement deux guillemets, aucun caractère spécial entre les guillemets et que la chaîne est le nom d'un fichier exécutable, alors les guillemets sont conservés.

Cependant, dans Dans l'exemple de code, la chaîne entre les guillemets contient un espace, violant la règle. Par conséquent, la commande cmd /k interprète la chaîne comme un nom d'exécutable non valide et génère l'erreur.

Solution

Pour résoudre ce problème, joignez l'intégralité de la commande dans des citations :

<code class="cpp">system("\"\"C:\Users\Adam\Desktop\pdftotext\" -layout \"C:\Users\Adam\Desktop\week 4.pdf\"\"");</code>

Cela garantit que la chaîne de commande entière est analysée comme un seul argument, empêchant la commande cmd /k de l'interpréter mal.

De plus, pour garantir que la chaîne est toujours analysée selon la règle correcte, vous pouvez inclure le commutateur /S :

<code class="cpp">system("cmd /S /C \"\"C:\Users\Adam\Desktop\pdftotext\" -layout \"C:\Users\Adam\Desktop\week 4.pdf\"\"");</code>

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn