環境変数を取得し、その結果から 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 値を返すためですか?