2009-04-15 4 views
1

Хорошо, мне нужно написать программу, которая принимает 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); 
    } 
} 

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

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

+0

Может кто-нибудь изменить это, чтобы сделать его более читаемым? мой представитель слишком мал, чтобы сделать это сам :( – Nathan

+0

высоко оценил :) – Nathan

ответ

1

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

#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

Мы не учили и не используем много того, что вы использовали ... спасибо, хотя! – Kaity

+0

Вы должны были пометить свой вопрос домашним тегом, если это домашняя работа. В противном случае вы получите ответы, а не рекомендации. Но приведенный выше код показывает вашу проблему: вам нужно сравнить строки с strcmp, а не ==. == просто сравнивает указатели, а не то, что они указывают. – paxdiablo

0

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

if (A[i] == x) 

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

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

+0

Как использовать strcmp()? я бы сказал A [i] strcmp (x) ???? – Kaity

+0

@Kaity: "if (strcmp (A [i], x) == 0) {...}" - пример показан в моем коде выше (на данный момент он может быть ниже в будущем :-). strcmp() - это функция, которая принимает два символа char * и возвращает 0 для равных или -1, +1 для arg1 arg2 соответственно. Вам нужно только беспокоиться о 0 в вашем случае. – paxdiablo

0
  • Вызов 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.