Как найти элемент в массиве в C - PullRequest
0 голосов
/ 04 июня 2010

Я пытаюсь найти расположение элемента в массиве. Я пытался использовать этот код, который я сгенерировал

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

varptr - указатель, который указывает на массив var [11] [10], и это по определению * varptr [11] [10]. Я назначил строки для var [i], и я хочу получить номер "i" моего элемента, а НЕ АДРЕСА.

Спасибо за любой комментарий.

EDit: temp также указатель, который указывает на строку, которую я хочу проверить. Также я использую 2D-массив для хранения имен переменных и их адресов. Так что да, я хочу сохранить его внутри 2D-массива. Вопрос в том, что этот код вообще не работает, он не присваивает i для j, поэтому мне интересно, в чем проблема с этой идеей? написание «перерыва» не меняет, работает ли код или нет, просто немного оптимизирует код.

Полный код:

#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;


}

Ответы [ 3 ]

1 голос
/ 04 июня 2010

Один комментарий: вы можете выйти из цикла, как только найдете строку.

#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;
    }
}

Еще один комментарий:

Мне не удалось понять, как varptr и var связаны друг с другом (пожалуйста, покажите определения). Я использовал var в приведенном выше предположении, что он определен:

char var[11][10];

также

char temp[10];
1 голос
/ 05 июня 2010
int i;
int found = 0;
for (i = 0 ; i < 11 ; i++)
{
    if (strcmp(temp,var[i]) == 0) 
    {
           found = 1; 
           break;
    }
}
1 голос
/ 04 июня 2010
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
...