2010-06-04 21 views
0

J'essaie de trouver l'emplacement d'un élément dans le tableau. J'ai essayé d'utiliser ce code i généréComment trouver un élément dans un tableau en C

for(i=0;i<10;i++) 
    { 
    if (strcmp(temp[0],varptr[i])==0) j=i; 
    } 

VarPtr est un pointeur qui pointe vers tableau var [11] [10] et il est par la définition * VarPtr [11] [10]. J'ai assigné des chaînes à var [i] et je veux obtenir le numéro "i" de mon élément PAS L'ADRESSE.

Merci pour vos commentaires. EDit: temp est aussi un pointeur qui pointe vers la chaîne que je veux vérifier. Aussi j'utilise le tableau 2D pour garder les noms de variables et leur adresse. Donc oui je veux le garder dans un tableau 2D. La question est que ce code ne fonctionne pas du tout, il n'attribue pas i à j, alors je me demande où est le problème avec cette idée? écrire une "pause" ne change pas si le code fonctionne ou non, il optimise un peu le code.

complet Code:

#include <stdio.h> 
#include <string.h> 
#include <ctype.h> 

double atof(char*); 
int main(void) 
{ 
    char in[100], *temp[10],var[11][10],*varptr[11][10]; 
    int i,j, n = 0,fullval=0; 
    double val[11]; 
    strcpy(var[11], "ans"); 
    for(i=0;i<11;i++) 
    { 
     for(j=0;j<10;j++) varptr[i][j]=&var[i][j]; 
    } 
START: 
    printf("Enter the expression: "); 
    fflush(stdout); 
    for(i=0;i<10;i++) temp[i]=NULL; 

    if (fgets(in, sizeof in, stdin) != NULL) 
    { 
     temp[0] = strtok(in, " "); 

     if (temp[0] != NULL) 
     { 
      for (n = 1; n < 10 && (temp[n] = strtok(NULL," ")) != NULL; n++) 
       ; 
     } 
     if (*temp[0]=="quit") 
     { 
      goto FINISH;} 

     if (isdigit(*temp[0])) 
     { 

      if (*temp[1]=='+') val[0] = atof(temp[0])+atof(temp[2]); 
      else if (*temp[1]=='-') val[0] = atof(temp[0])-atof(temp[2]); 
      else if (*temp[1]=='*') val[0] = atof(temp[0])*atof(temp[2]); 
      else if (*temp[1]=='/') val[0] = atof(temp[0])/atof(temp[2]); 
      printf("%s = %f\n",var[11],val[0]); 
      goto START; 

     } 
     else 
      if (temp[1]==NULL) //asking the value of a variable 
      { 
      for(i=0;i<10;i++) 
      { 
      if (strcmp(temp[0],varptr[i])==0) j=i; 
      } 
      printf("%s = %d\n",var[j],val[j]); 
      goto START; 
      } 
      if (*temp[1]==61) 
      { 
      strcpy(var[fullval], temp[0]); 
      if ((temp[3])!=NULL) 
      { 
      } 
      val[fullval]=atof(temp[2]); 
      printf("%s = %f\n",var[fullval],val[fullval]); 
      fullval++; 
      goto START; 
      } 
      if (*temp[1]!=61) 
      { 


      } 

    } 
    getch(); 
FINISH: 
    return 0; 


} 
+0

Quelle est 'temp'? – pkh

+6

Pas assez de code. Publiez plus, y compris les définitions de variables et les initialisations. – abelenky

+0

Si vous avez trouvé l'index et l'avez stocké dans j, interrompez la boucle. Vous ne trouverez pas de meilleur résultat. – harper

Répondre

1

Un commentaire: vous pouvez sortir de la boucle dès que vous trouvez votre chaîne.

#define NOT_FOUND (-1) 

int j = NOT_FOUND; 
int i; 
for (i = 0 ; i < 11 && j == NOT_FOUND; i++) 
{ 
    if (strncmp(temp,var[i], 10) == 0) // Nick D's comment 
    { 
     j = i; 
    } 
} 

Un autre commentaire:

Je ne pouvais pas comprendre comment VarPtr et var se rapportent les uns aux autres (s'il vous plaît montrer les définitions). Je l'ai utilisé var dans ce qui précède sur l'hypothèse qu'il est défini:

char var[11][10]; 

également

char temp[10]; 
+0

pourquoi deux tests en boucle? – Nyan

+0

Voulez-vous dire pourquoi 'i <11 && j == NOT_FOUND'? C'est parce que si le premier élément correspond à votre chaîne, il ne sert à rien de vérifier les 10 autres. – JeremyP

1
j=-1; 
for(i=0;i<10;i++) 
{ 
    if (strcmp(temp[0],varptr[i])==0) {j=i;break;} 
}//strcmp is not safe, try use strncmp 
+0

de goto Quel est le problème avec strcmp? – Secure

+0

S'appuie sur la présence d'un '\ 0' pour arrêter la lecture d'une chaîne. –

+0

Ce n'est pas une chaîne si elle n'a pas de '\ 0'. – nos

1
int i; 
int found = 0; 
for (i = 0 ; i < 11 ; i++) 
{ 
    if (strcmp(temp,var[i]) == 0) 
    { 
      found = 1; 
      break; 
    } 
}