2016-04-19 24 views
-5

引数を関数strcmpしようとしたときこんにちは、私は[しかし、事前に定義された文字列に文字列配列を比較する必要があるが、私は、変数引数を使用するときに[0]それはなぜ1つのセグがフォールトしているのですか?

int gash_execute(char **args){ 
    int i; 

    if(args[0] == NULL){ 
     return 1; 
    } 

    for(i = 0; i < gash_command_num(); i++){ 
     if(strcmp(args[0], functions[i]) == 0){ 
      return(*function_address[i])(args);  
     } 
    } 
    return gash_launch(args); 
} 

以下のように私の関数のstrcmpで動作するプログラムを持っています私は以下のように私はsegの欠陥を取得します。誰も私にこの問題の解決策を見つけるのを助けることができますか?

int gash_execute(char **args){ 
    int i; 

    if(args[0] == NULL){ 
     return 1; 
    } 

    for(i = 0; i < gash_command_num(); i++){ 
     if(strcmp(args[i], functions[i]) == 0){ 
      return(*function_address[i])(args);  
     } 
    } 
    return gash_launch(args); 
} 

引数[]は、以前スペースで区切られた文字列の配列で、このプログラムは、I入力「猫のエコーLS」引数[0]になります私のシェルコマンドラインでふりカスタムシェルのためなので、 "猫"など。しかし、今私は/リダイレクトを実装する必要があります。だから、私はargsのすべての要素が "<" ">" "" | "そのうちの1つがそこから取り出せる場合

+3

あなたはあまりにもargs配列を読み込んでいます。変数の意味を説明していないので、これ以上のことは言い難いです。 – jforberg

+0

'gash_command_num'、' functions'、 'function_address'、' gash_launch'とは何ですか?あなたの最小、完全、および検証可能な例はどこですか? – inetknght

+0

'gash_command_num()'ソースを表示できますか? – vmonteco

答えて

1

すべてのコードやvalgrindなどのツールのレポートを見ることなく、私は確かに言えません。しかし、私はこのループは潜在的な問題がいっぱいであることを伝えることができます。

for(i = 0; i < gash_command_num(); i++){ 
    if(strcmp(args[i], functions[i]) == 0){ 
     return(*function_address[i])(args);  
    } 
} 

それは、これらの配列に実際にどのように多くの要素への未知の関係を持っている変数(gash_command_num())として、これらのどれを取らない、いくつかの関数呼び出しに基づいて、3つの配列(argsfunctions、およびfunction_address)を反復処理です。

そして、何かを含むことができる2つのグローバル変数(functionsfunction_addresses)を使用しています。

これらのすべてが関連している場合は、明示的にすることをお勧めします...しかし、私はそうではないと思われます。あなたのループロジックが間違っていると思われます。 args[i]functions[i]を比較しています。私はgash_command_num()が実際にfunctionsのサイズであると思われ、ループはargsを歩いています。私はあなたが本当にやりたい疑う何

args[0]functions内の任意の関数名と一致するかどうかを確認して、関連する機能を呼び出すことです。 args[0]lsの場合は、lsのシェル関数が組み込まれているかどうかをチェックし、すべての引数で呼び出す必要があります。

リストを何度も繰り返し検索するのではなく、2つの並行リストを管理するのではなく、これはhash tableで処理する方がはるかに良いでしょう。キーは関数名で、値は関数ポインタです。 Cにはハッシュテーブルが組み込まれていませんが、そのためのライブラリはたくさんあります。 Gnome Libは、これとCが欠いている他の多くの基本機能のための確かな選択です。

ハッシュテーブルを使用して、グローバルを排除し、あなたのコードは、これに削減:パイプ用

/* For encapsulation */ 
typedef int(*shell_function_t)(char **); 

int gash_execute(char **args, GHashTable *shell_functions){ 
    int i; 

    if(args[0] == NULL){ 
     return 1; 
    } 

    shell_function_t func = g_hash_table_lookup(shell_functions, args[0]); 
    if(func) { 
     return(*func)(args); 
    } 
    else { 
     return gash_launch(args); 
    } 
} 

スキャンは現在、別の問題です。あなたのためにdoargsをループして特殊文字を探しています。これは、argsを作成するときにnullポインタで終わることを確認すると、はるかに簡単になります。

for(int i = 0; args[i] != NULL; i++) { 
    ...check if args[i] is special... 
} 
関連する問題