2013-09-04 3 views
-2

Je rencontre des difficultés pour essayer cette erreur de segmentation d'exécution dans ce court morceau de code. Je soupçonne que cela a quelque chose à voir avec l'utilisation de system() et strcpy() dans le code mais comme je n'ai pas l'expérience de ce type d'erreur, je ne sais pas quoi faire et je n'ai pas trouvé beaucoup de pages utiles jusqu'ici.Erreur de segmentation (core dumped) erreur avec strcpy() (suspectée)

Le code:

#include <stdio.h> 
#include <string.h> 
int main(){ 
     char command[31], string[128]; 
     strcpy(string, (char *)system("grep -Po '(?<=testString\\s)\\S+' File")); 
     string[strlen(string)] = '\0'; 
     printf("%s", string); 
     return 0; 
} 

J'utilise GCC 4.7.3 pour compiler le programme. J'apprécierais vraiment n'importe quelle aide avec ceci beaucoup.

+3

Vous castez la valeur de retour 'int' de [' installation privée] (http://linux.die.net/man/3/system) à un chaîne ... Aucun bien ne peut venir de ça. –

+0

Votre utilisation de 'system' est incorrecte, vous pouvez utiliser [popen (3)] (http://man7.org/linux/man-pages/man3/popen.3.html) –

+0

Lorsque vous utilisez un système ou API autre, vous devriez lire la documentation concernant cet appel pour déterminer ce qu'il accepte et retourne. 'system' ne retourne pas la sortie de la commande que vous exécutez. Il fournit seulement un code de retour. Si vous voulez capturer la sortie, vous pouvez avoir la sortie de l'appel 'system' dans un fichier que vous ouvrez et lisez après l'appel, ou utiliser des pipes (' popen', etc). – lurker

Répondre

0

La commande system renvoie -1 en cas d'erreur ou l'état de retour de la commande sinon.

Le lancement de ce type integer return value provoque le segmentation fault dans ce cas.

Pour copier la sortie de la commande dans un tampon, nous pourrions utiliser popen qui renvoie un pointeur de fichier FILE * à partir duquel vous pouvez lire la sortie de la commande.

Voici le code:

#include <stdio.h> 
#include <stdlib.h> 


int main(int argc, char *argv[]) 
{ 

    FILE *fp; 
    char string[128]; 


    /* Open the command for reading. */ 
    fp = popen("grep -Po '(?<=testString\\s)\\S+' File ", "r"); 

    if (fp == NULL) { 
     printf("Failed to run command\n"); 
     exit; 
    } 

    /* Read the output of command */ 
    while (fgets(string, sizeof(string)-1, fp) != NULL) { 
     printf("%s", string); 
    } 

    /* Close */ 
    pclose(fp); 

    return 0; 
} 
2

system ne renvoie pas char * mais int. En utilisant sa valeur de retour sous forme de chaîne - char * - le plus probable vous donnera segfault.

int système (commande const char *);

VALEUR RENVOYÉE La valeur renvoyée est -1 en cas d'erreur (par exemple, échec de fork (2)) et l'état renvoie l'état de la commande sinon. Ce dernier état de retour est dans le format spécifié dans wait (2). Ainsi, le code de sortie de la commande sera WEXITSTATUS (statut). Dans le cas où/bin/sh n'a pas pu être exécuté, le statut de sortie sera celui d'une commande qui quitte (127).

+0

Merci pour les réponses très rapides! Merci @mbratch, je vais certainement regarder ça :) – jkrix

Questions connexes