Сопоставить аргументы с первым аргументом - PullRequest
1 голос
/ 15 апреля 2009

Хорошо, я должен написать программу, которая принимает 2 или более аргумента и ищет второй и оставшийся аргументы для поиска подходящего аргумента.
например, вывод будет:

./a 3 h 4 9 3  
3 found  

или

./a hsi and iash me 34 hsi  
hsi found  

Пока у меня есть это, и я почти уверен, что у меня здесь много мусора, который бесполезен в этой ситуации. Буду признателен за любую помощь !:

int linear_search (const char*A[], char*x, int v ){  
    int i;  
    i = 0;  
    while ( i < v - 1){  
        if  (A[i] == x){  
            return 1;  
        }  
        return 0;  
    }  
}  

int main (int argc, char*argv[]){  
    int size = argc - 1;  
    char*A[size];  
    char*x = argv [1];  
    int i;  
    int v = argc - 2;  

    i = 0;  
    while ( i < v ){  
        A[i] = argv [i + 1];  
        i = i +1;  
    }  

    if (linear_search (A, v, x)){  
        printf ("%s found\n", x);  
    } else {  
        printf ("%s not found\n", x);  
    }  
}  

Всякий раз, когда я запускаю программу через компилятор, я получаю предупреждение: передача аргумента 1 'linear_search' из несовместимого типа указателя.
предупреждение: передача аргумента 2 из 'linear_search' делает указатель из целого числа без приведения.

Что это значит?

Ответы [ 3 ]

1 голос
/ 15 апреля 2009

Вот как бы я это сделал. Вам не нужна отдельная функция линейного поиска.

#include <stdio.h>
#include <string.h>
int main (int argCount, char *argVar[]) {
    int i;
    if (argCount < 3) {
        fprintf (stderr, "Usage: argfind <argToFind> <otherArg> ...\n");
        return 1;
    }
    for (i = 2; i < argCount; i++) {
        if (strcmp (argVar[1], argVar[i]) == 0) {
            printf ("'%s' found in argument %d\n", argVar[1], i);
            return 0;
        }
    }
    printf ("'%s' not found\n", argVar[1]);
    return 0;
}
0 голосов
/ 15 апреля 2009
  • Вызов linear_search не соответствует объявлению. Это должно, по крайней мере, дать вам предупреждения, если не откровенные ошибки.

    Декларация:

    linear_search (const char*A[], char*x, int v )

    тогда как вызов:

    linear_search (A, v, x)

    Последние два аргумента действительно должны поменяться местами.

  • Также вы не можете использовать оператор == для сопоставления строк в C. Вам придется использовать один из strcmp, strncmp или memcmp .`

  • Возможно, вам нужно начать копирование, если вы планируете использовать A из индекса 2, а не первого (argv[ 1 ] - это ключ, который вы ищете, вставив его в A всегда будет возвращать совпадение, даже если его нет в остальной части списка аргументов).

  • Обратите внимание, что в C вы можете использовать оператор индекса, чтобы передать часть массива функции, поэтому вам не нужно копировать в массив A. Вы могли просто сделать &argv[ 2 ] в качестве первого параметра linear_search.

0 голосов
/ 15 апреля 2009

Думаю, проблема в функции линейного поиска ... Похоже, вы просто сравниваете указатели, чтобы увидеть, совпадают ли их строки.

if (A[i] == x) 

С так не работает. Все, что делает, это проверяет, совпадают ли адреса указателя. Вам необходимо использовать функцию strcmp (), чтобы убедиться, что фактические строки совпадают.

Я также рекомендую работать с именами переменных немного более наглядно, так как это намного облегчает чтение. :)

...