поиск строки в массиве строк - PullRequest
0 голосов
/ 08 марта 2019

Я написал некоторый код, который должен найти местоположение данной строки в массиве строк. проблема в том, что это не дает места. это дает что-то еще.

Я понимаю, что, вероятно, проблема связана с различиями между указателями, которые использовались - предыдущая версия, которая имела дело с поиском положения буквы в слове, работала хорошо. после многих попыток выяснить, где ошибка, я прошу вашей помощи. пожалуйста, объясните мне, что должно быть сделано.

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


int what (char * token);

main()
{
    int i=0;
    char  string[]="jsr";
    char *token;
    token=&string[0];
    i=what(token);
    printf(" location of input is %d \n", i);
    return 0;

}   

int what (char * token)
{
    int i=1;
    char *typtbl[]={"mov",
        "cmp",
        "add",
        "sub",
        "not",
        "clr",
        "lea",

    };  

    char * ptr;

    ptr=(char *)typtbl;
    while (!(strcmp(ptr,token)==0))
    {
        ptr=(char *)(typtbl+i);
        i++;
    }   
    return i;
} 

Ответы [ 3 ]

0 голосов
/ 08 марта 2019

Более чистая рабочая версия.

Основная проблема в (char *)(typtbl+i) заменена на typtbl[i] в следующем коде.typtbl+i эквивалентно &typtbl[i], поэтому, если у меня хорошая память, это указатель на указатель строки, а не указатель самой строки

Я добавил NULL в конце массива, чтобыможно было остановить, если строка отсутствует, и вернуть -1, чтобы четко сказать, что она не найдена.

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

int what(char *token);

int main()
{
    int i = 0;
    char string[] = "jsr";
    i = what(string);
    printf(" location of input is %d \n", i);
    return 0;
}

int what(char *token)
{
    char *typtbl[] = {
        "mov",
        "cmp",
        "add",
        "jsr",
        "not",
        "clr",
        "lea",
        NULL
    };

    int i = 0;
    while(typtbl[i] && !(strcmp(typtbl[i], token) == 0)) {
        ++i;
    }

    if(!typtbl[i])
        i = -1;

    return i;
}

char *token; token=&string[0]; бесполезно, поскольку string == &string[0].

0 голосов
/ 08 марта 2019

Несколько вещей:

  • В вашей основной функции отсутствует тип возвращаемого значения.
  • Цикл while в what не останавливается, когда элемент не найден. Поэтому вы читаете за пределами.

Это должно делать работу без арифметики указателя.

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


int what (char * token);

int main(){
    int i=0;
    char  string[]="jsr";
    char *token;
    token=&string[0];
    i=what(token);
    printf(" location of input is %d \n", i);
    return 0;
}   

int what (char * token){
    unsigned int i=0;
    char *typtbl[]={"mov",
        "cmp",
        "add",
        "sub",
        "not",
        "clr",
        "lea",

    };  
    unsigned int typtbl_x_size = sizeof(typtbl)/sizeof(typtbl[0]);
    char * ptr;

    ptr=typtbl[i];
    while (!(strcmp(ptr,token)==0)){
        i += 1;
        if (i >= typtbl_x_size){
            printf("element not in list\n");
            return -1;
        }
        ptr=typtbl[i];
    }   
    return i;
}
0 голосов
/ 08 марта 2019

Как указывалось, вы неправильно спроектировали функцию what. Какое значение должно возвращаться, если ваша функция поиска проходит через все указатели, но не находит нужную строку? Обычно в этом случае return -1 будет выбором, чтобы указать, что ничего не найдено. Также в этом случае использование цикла for, вероятно, было бы более подходящим, вы можете просто немедленно вернуть индекс, а не проходить через все указатели.

int what(char *token)
{
    char *typtbl[] = {
        "mov",
        "cmp",
        "add",
        "sub",
        "not",
        "clr",
        "lea",

    };

    for( size_t i = 0; i < sizeof(typtbl)/sizeof(char*); ++i )
    {
        char *ptr = typtbl[i];
        if(strcmp(ptr, token) == 0)
        {
            return i;  // found something
        } 
    }

    return -1;  // found nothing
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...