Jump to content
mtrriba

Fazer pesquisa em strings

Recommended Posts

mtrriba

Estou a elaborar um programa em C (trabalho para a escola) e quero fazer um ciclo para procurar a repetição de uma determinada palavra referente a uma matriz de strings só que a pesquisa só me devolve a primeira palavra presente na matriz que procuro as restantes palavras repetidas não aparecem.

A função pesquisar é a seguinte:

int pesquisar(char m[][MAX],char m1[][MAX1], m2[], int nlinhas,char str[])
{
    int nl;
    for (nl=0;nl<nlinhas;nl++)
        if(strcmp(m[nl], str)==0)
            return nl;
    return -1;
}

A função consultar chama a função pesquisar e é a seguinte:
void consultar(char m[][MAX_CHAR_MAT],char m1[][MAX_CHAR_MARCAS], float v_aut_max[], int nlinhas)
{
    int linha;
    char str[MAX];
    if(nlinhas!=0)
    {
        printf("Qual e a marca da viatura para consultar?");
        fflush(stdin);
        gets(str);
        linha= pesquisar(m,m1,m2,str);
            if (linha!=-1)
            {
                printf("Marca: %s\t",m[linha]);
                printf("Modelo: %s\t",m1[linha]);
                printf("Motorizacao: %.2f\t",m2[linha]);
            }
            else
                printf("nao foi encontrada");
    }
    else
        printf("Matriz vazia");
getch();
}

Se houver alguém que me possa ajudar agradecia

Obrigado

Share this post


Link to post
Share on other sites
Baderous

Isso é normal visto que estás a fazer return dentro do if na função pesquisar.

Share this post


Link to post
Share on other sites
KTachyon

A minha primeira pergunta seria: porque é que achaste que esta dúvida se ajusta a este tópico?

A minha primeira sugestão seria colocares as tags [ code=c ] e [ /code ] (sem espaços) à volta do código, para que fique mais legível.

Depois, isto:

int pesquisar(char m[][MAX],char m1[][MAX1], m2[], int nlinhas,char str[])
{
    int nl;
    for (nl=0;nl<nlinhas;nl++)
        if(strcmp(m[nl], str)==0)
            return nl;
    return -1;
}

Não é muito correcto. Deves inicializar a variável de retorno a -1 e fazer um break no ciclo e retornar sempre a variável de retorno. Assim:

int pesquisar(char m[][MAX],char m1[][MAX1], m2[], int nlinhas,char str[])
{
    int nl = -1;
    for (nl=0;nl<nlinhas;nl++)
        if(strcmp(m[nl], str)==0)
            break;
    return nl;
}

E, o teu problema é basicamente esse. Só retornas um int com a posição da string no array. Se queres devolver vários tens que retornar vários, utilizando, por exemplo, um ponteiro para int.

Alocas a memória e vais colocando o que encontras sucessivamente nesse espaço de memória. Em vez de fazeres return, ou break (na minha correcção), continuas a pesquisa por mais strings iguais.


“There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult.”

-- Tony Hoare

Share this post


Link to post
Share on other sites
mtrriba

Em relação ao tópico foi um equivoco da minha parte.

Obrigado pela dica

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.