0

環境変数を取得し、その結果から strstr を使用して特定の単語を検索できるコードを C で作成しようとしています。UBUNTU OS と gcc コンパイラを使用しています。これが私が書いたコードです。コメントは私が期待していたことです。

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

extern char **environ;
extern char **tmp;
extern char **tmp2;

char *search_string(char *tmp,int x)
{
      char string[]="ABC";          //I'm looking for ABC in the environment variable
      char *pointer;
      pointer=strstr(tmp,string);   //pointer will point to the result of strstr
      if(pointer != NULL)
      {       printf("%s ,",tmp);
              printf("data found : %s \n",pointer);
      } else  {
              //hope to do something
      }
      return (pointer);
}

int main(char *tmp2)
{
      int x = 0;
      for(x=0;environ[x]!='\0';x++){   //I'm expecting it to keep looping until finish
      tmp2=search_string(environ[x],x); //tmp2 will point to the function return value
      printf("%s\n",tmp2);             //print the return value
      }  //If the search_string return NULL, does it consider string or something else?
      return 0;
}

コードを実行すると、コア ダンプが原因でクラッシュします。ここに出力があります。

ABC=/tmp ,data found : ABC=/tmp 
ABC=/tmp
Segmentation fault (core dumped)

私が見たところ、search_string は 1 回しか実行できません。その後、クラッシュします。次に、gdb を使用して、実際にクラッシュする行を調べます。結果は次のとおりです。

Starting program: /home/fikrie/a.out 
ABC=/tmp ,data found : ABC=/tmp 
ABC=/tmp

Program received signal SIGSEGV, Segmentation fault.
__strlen_ia32 () at ../sysdeps/i386/i686/multiarch/../../i586/strlen.S:99
99  ../sysdeps/i386/i686/multiarch/../../i586/strlen.S: No such file or directory.

デバッグから理解できないのは、SEGV 信号が原因でエラーを受信して​​いることです。誰かがこの問題を解決する方法を教えてもらえますか? search_string が NULL 値を返すためですか?

4

2 に答える 2

2

問題はsearch_string()、文字列が見つからない場合に が返されることNULLです。それを に渡すとNULLprintf()クラッシュします。

ではmain()、次のようなものが必要です。

if (tmp2)
    printf("%s\n", tmp2);

また、tmp2変数の型char *は ではなくである必要がありchar **ます。そして、それを local に宣言しない理由はありませんmain()

于 2013-10-29T03:08:19.280 に答える
0

メイン ループを非常に簡単に変更するだけで、プログラムがクラッシュするのを防ぐことができます。

int main(char *tmp2)
{
      int x = 0;
      for(x=0;environ[x]!='\0';x++){   //I'm expecting it to keep looping until finish
      tmp2=search_string(environ[x],x); //tmp2 will point to the function return value
// >>>>> change these next two lines:
      if(tmp2 != NULL) printf("%s\n",tmp2);             //print the return value
      else printf("%s does not contain ABC\n", environ[x]);
// <<<<< end of change
      }  //If the search_string return NULL, does it consider string or something else?
      return 0;
}

break;一致が 1 つしかないと予想される場合は、一致を印刷するときに a を追加できることに注意してください。上記のコードは、すべての環境変数を出力します - 停止しないことがわかります...

于 2013-10-30T01:36:12.140 に答える