2010-11-06 6 views
0

J'essaie de définir les valeurs de M et N dans ce programme à tout ce qui est analysé à partir d'une chaîne que ce programme C reçoit sur sa ligne de commande. Cependant, je reçois une erreur de segmentation chaque fois que je lance le code. Je suis nouveau au concept de pointeur en C, donc je sais que c'est quelque chose là-bas.Pourquoi ai-je une erreur de segmentation dans ce programme?

Le code est censé fonctionner comme suit:

./a.out -1,12

Prints:

1, 12

Merci pour toute aide!

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

    void getnumber(char *toTest, int *a, int *c); 

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

      int a, c, curr; 

      a = 1; 
      c = 1; 
      curr = 1; 

      if (argv[1][0] == '-') 
      { 
        curr = 2; 
        getMandNValues(argv[1], &a, &c); 
      } 

      printf("%d, %d\n", a, c); 
      return 0; 
    } 


    void getMandNValues(char *src, int *a, int *c) 
    { 

      char aString[sizeof src]; 
      char bString[sizeof src]; 

      int i = 0; 

      while((aString[i] = &src[i+1]) != ',') 
        ++i; 

      aString[i] = '\0'; 

      int j = 0; 

      while((bString[j] = &src[i + 2]) != '\0') 
      { 
        ++j; 
        ++i; 
      } 

      bString[j] = '\0'; 

      *a = atoi(aString); 
      *c = atoi(bString); 
    } 

La sortie du compilateur est:

/tmp/foo.c: In function ‘main’: 
/tmp/foo.c:18: warning: passing argument 2 of ‘getMandNValues’ makes pointer from integer without a cast 
/tmp/foo.c:18: warning: passing argument 3 of ‘getMandNValues’ makes pointer from integer without a cast 
/tmp/foo.c: In function ‘getMandNValues’: 
/tmp/foo.c:34: warning: assignment makes integer from pointer without a cast 
/tmp/foo.c:41: warning: assignment makes integer from pointer without a cast 
+2

J'espère sincèrement que vous n'avez pas réellement indenté (ou plutôt n ot) tout votre code comme ça ... –

+0

Quelqu'un devrait laisser un commentaire sur les longueurs de aString et bString. –

+0

la taille de aString et bString sera toujours 4 dans votre code. Ils ne seront pas la longueur de la chaîne passée dans src. –

Répondre

2
getMandNValues(argv[1], a, c); 

devrait être

getMandNValues(argv[1], &a, &c); 
1

vous devriez passer un & et & c à la fonction, pour un.

3

N'a pas regardé à tout mais vous avez besoin de l'adresse des vars pour cet appel. Je ne sais pas quel compilateur vous utilisez mais je ne voudrais pas ignorer l'avertissement qu'il doit avoir affiché lors de la compilation. (Si vous n'utilisez pas le plus haut niveau d'avertissement vous devriez.)


Vous cherchez un peu plus il y a un autre problème

while((aString[i] = &src[i+1]) != ',') 
    ++i; 

semble étrange (et mal). Je fais ceci:

int index=0; 
do 
{ 
    aString[index] = src[index+1]; 
    index++; 
} while (str[index] != ',') 

ici est un autre problème

char aString[len(src)]; 
char bString[len(src)]; 
0

Vous mixez getnumber et getMandNvalues.

Vous avez fourni un prototype pour getnumber mais aucune définition de cette fonction. Vous avez fourni une définition de getMandNvalues mais pas de prototype avant d'appeler cette fonction.

L'appel d'une fonction sans prototype est autorisé. Le compilateur suppose qu'il renvoie int et tous les arguments sont int. Ni l'un ni l'autre n'est vrai dans ce cas.

corriger votre prototype

0

Vous passez le un int et int c à la fonction qui attend l'int * a et int * c

au lieu d'utiliser

getMandNValues(argv[1], a, c); 

, essayez

getMandNValues(argv[1], &a, &c); 
Questions connexes