1

Linux と C の学習を始めたばかりです。厳密に判断しないでください。

現在の作業ディレクトリを見つけて、このディレクトリ内のファイルを開いて特定の単語を見つけようとしています。cwd しか見つからない場合は正しい cwd が返されますが、while ループ cwd を追加すると null になります。

#include <unistd.h>
#include <stdio.h>
#include <limits.h>
main(){
char *buff;
char *currentDir =getcwd(buff,PATH_MAX);

printf("Current directory: %s\n",currentDir);

FILE *file;
char *filename = "profile";
file = fopen(filename,"r");
if(file == NULL)
{
fprintf(stderr,"File %s wasn't found\n",filename);
}

while(1)
{
    char buffer[80];
    char *token;
    fgets(buffer,80,file);
    if(feof(file))
    {break;}
    else{
    *token = strtok(buffer,"=");
        if(strcmp(token,"HOME")==1);
        {
        printf("HOME token is found");
        } 
    }
free(token);
}

fclose(file);
}

出力: 現在のディレクトリ: (null) セグメンテーション違反

4

4 に答える 4

6

buffランダムメモリを指しています。

次のように宣言することbuffもできます。

char buff[PATH_MAX] = "";

Linux の場合は、代わりにgetcwd()必要なメモリを割り当てることができます。

char * currentDir = getcwd(NULL, 0);

currentDirfree()終了時に に渡す必要があり、その場合buffは必要ありません。

于 2012-10-24T10:30:08.227 に答える
1

次の行を削除します。

無料(トークン);

tokenbufferスタック上にある を指します。したがって、解放する必要はありません。

別のバグは次のとおりです。

*token = strtok(buffer,"=");

strtok()を返すchar*ので、これは次のようになります。

token = strtok(buffer,"=");

また、ループを次のように変更する必要があります。

#include <string.h>

...
char buffer[80];
while (fgets(buffer,80,file)) {
    char *token = strtok(buffer,"=");
    if (strcmp(token,"HOME") == 0);
    {
        printf("HOME token is found");
    }
...
于 2012-10-24T10:32:40.913 に答える
0

現在のディレクトリを取得する小さな関数:

void get_working_dir(void) 
{
    char buf[PATH_MAX];

    if (getcwd(buf, sizeof(buf)) == NULL) {
       fprintf(stderr, "Err.:(%d) - %s: curr. workdir\n", errno,strerror(errno));
       exit(EXIT_FAILURE);
    }

    /* print current directory */
    printf("%s\n", buf);
}

次の関数を呼び出します。

get_working_dir();
于 2012-10-24T11:12:37.807 に答える