1

我刚开始学习linux和C,请不要严格评判我。

我正在尝试查找当前工作目录并在此目录中打开文件以查找特定单词。如果我只找到 cwd,它会给出正确的 cwd,但是当我添加 while 循环 cwd 为空时。

#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);
}

输出:当前目录:(空)分段错误

4

4 回答 4

6

buff指向随机内存。

你可能想这样声明buff

char buff[PATH_MAX] = "";

如果在 Linux 上,则可以getcwd()通过这样做来分配所需的内存:

char * currentDir = getcwd(NULL, 0);

currentDir完成后需要传递给free()它,buff然后不需要。

于 2012-10-24T10:30:08.227 回答
1

删除行:

免费(代币);

token指向buffer,它在堆栈上。所以,不需要释放它。

另一个错误是:

*token = strtok(缓冲区,"=");

strtok()返回 a 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 回答
0

我遇到了同样的问题,所以我查看了手册页,据说如果 getcpw() 系统调用为 NULL,它将 malloc 缓冲区。我认为问题在于您的缓冲区没有为空,因此请尝试使用 NULL 指针对其进行初始化

    char *buff=NULL;
    buff=getcwd(buff,PATH_MAX);

于 2021-10-29T19:01:50.210 回答