1

さて、2 つ以上の引数を受け入れ、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);  
    }  
}  

コンパイラを介してプログラムを実行するたびに、互換性のないポインター型から 'linear_search' の arg 1 を渡していますという警告が表示されます。
警告: 'linear_search' の引数 2 を渡すと、キャストなしで整数からポインターが作成されます。

どういう意味ですか?

4

3 に答える 3

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;
}
于 2009-04-15T04:10:04.077 に答える
0

問題は線形検索機能にあると思います...ポインターを比較して、文字列が同じかどうかを確認しているようです。

if (A[i] == x) 

Cはそのようには機能しません。ポインターのアドレスが同じかどうかを確認するだけです。実際の文字列が同じであることを確認するには、strcmp() 関数を使用する必要があります。

また、変数にもう少しわかりやすい名前を付けることをお勧めします。これにより、読みやすくなります。:)

于 2009-04-15T04:17:06.010 に答える
0
  • の呼び出しがlinear_search宣言と一致しません。これにより、完全なエラーではないにしても、少なくとも警告が表示されるはずです。

    宣言は次のとおりです。

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

    一方、呼び出しは次のとおりです。

    linear_search (A, v, x)

    最後の 2 つの引数は実際に交換する必要があります。

  • ==また、演算子を使用して C の文字列を照合することはできません。または .`のいずれかstrcmpを使用する必要があります。strncmpmemcmp

  • 最初のものではなくAインデックスから使用する予定がある場合は、おそらくコピーを開始する必要があります(これは検索しているキーです。それを入れると、残りの引数のどこにもない場合でも、常に一致が返されます)リスト)。2argv[ 1 ]A

  • C では、添字演算子を使用して配列の一部を関数に渡すことができるため、配列へのコピーは必要ありませんA&argv[ 2 ]の最初のパラメーターとして行うことができましたlinear_search

于 2009-04-15T04:27:30.150 に答える