Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
getcwd()在创建新指针后返回NULL_C_Segmentation Fault_Getcwd - Fatal编程技术网

getcwd()在创建新指针后返回NULL

getcwd()在创建新指针后返回NULL,c,segmentation-fault,getcwd,C,Segmentation Fault,Getcwd,我刚刚开始学习linux和C,请不要严格评判我 我试图找到一个当前的工作目录,并打开该目录中的文件以查找特定的单词。如果我只找到cwd,但当我添加while循环cwd为null时,它会给出正确的cwd #include <unistd.h> #include <stdio.h> #include <limits.h> main(){ char *buff; char *currentDir =getcwd(buff,PATH_MAX); printf("Cu

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

我试图找到一个当前的工作目录,并打开该目录中的文件以查找特定的单词。如果我只找到cwd,但当我添加while循环cwd为null时,它会给出正确的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);
}
输出: 当前目录:空 分段错误

buff指向随机内存

您可能希望这样声明buff:

如果在Linux上,则可以让getcwd分配所需的内存:

char * currentDir = getcwd(NULL, 0);
完成currentDir后需要将其传递给free,此时不需要buff。

buff指向随机内存

您可能希望这样声明buff:

如果在Linux上,则可以让getcwd分配所需的内存:

char * currentDir = getcwd(NULL, 0);
完成currentDir后,需要将其传递给free,此时不需要buff。

删除该行:

免费代币

令牌指向堆栈上的缓冲区。所以,没有必要释放它

另一个错误是:

*令牌=strtokbuffer,=

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");
    }
...
删除该行:

免费代币

令牌指向堆栈上的缓冲区。所以,没有必要释放它

另一个错误是:

*令牌=strtokbuffer,=

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");
    }
...

获取当前目录的小函数:

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();

获取当前目录的小函数:

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();

安装ddd调试器,它将帮助您在printf之后不能声明文件*char*等statement@BhavikShah从C99开始,您就可以在标准C中混合变量声明和代码,并将其作为许多编译器的扩展,由于它使我的答案无法理解。安装ddd调试器,它将帮助您也不能在printf之后声明文件*char*等statement@BhavikShah从C99开始,您就可以在标准C中混合变量声明和代码,并将其作为许多编译器的扩展,由于它使我的答案无法理解。缓冲区是通过调用fgets初始化的。所以,没问题。对不起,你也指什么@对不起,是我的错。我混淆了buff和buffer。但这里也是如此。不需要使用=,因为buff是通过调用getcwd初始化的。如果getcwd失败,buff可能未初始化@OlafDietschebuffer通过调用fgets进行初始化。所以,没问题。对不起,你也指什么@对不起,是我的错。我混淆了buff和buffer。但这里也是如此。不需要使用=,因为buff是通过调用getcwd初始化的。如果getcwd失败,buff可能未初始化@谢谢奥拉夫。我明白为什么我有标记初始化错误。我编辑了它,但编译器说行char*token=strtokbuffer,=;赋值从整数生成指针,但没有castOk,我错过了。您需要包括string.h。还可以将strcmp更改为==0,因为1表示大于、等于和小于。include包括strtok、strcmp等的声明。。。。如果使用未声明的函数,编译器将假定返回值为int,这在本例中是错误的:char*strtokchar*,const char*。谢谢Olaf。我明白为什么我有标记初始化错误。我编辑了它,但编译器说行char*token=strtokbuffer,=;赋值从整数生成指针,但没有castOk,我错过了。您需要包括string.h。还可以将strcmp更改为==0,因为1表示大于、等于和小于。include包括strtok、strcmp等的声明。。。。如果使用未声明的函数,编译器将假定返回值为int,在本例中这是错误的:char*strtokchar*,const char*.failure时调用exit不是预期的行为-我不建议在没有充分理由的情况下这样做。failure时调用exit不是预期的行为-我不建议在没有充分理由的情况下这样做。