getcwd()在创建新指针后返回NULL
我刚刚开始学习linux和C,请不要严格评判我 我试图找到一个当前的工作目录,并打开该目录中的文件以查找特定的单词。如果我只找到cwd,但当我添加while循环cwd为null时,它会给出正确的cwdgetcwd()在创建新指针后返回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
#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不是预期的行为-我不建议在没有充分理由的情况下这样做。