我刚开始学习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: %sn",currentDir);
FILE *file;
char *filename = "profile";
file = fopen(filename,"r");
if(file == NULL)
{
fprintf(stderr,"File %s wasn't foundn",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
:
char buff[PATH_MAX] = "";
如果在 Linux 上,那么也可以让getcwd()
分配所需的内存:
char * currentDir = getcwd(NULL, 0);
完成后,currentDir
需要传递给free()
,然后不需要buff
。
删除该行:
免费(代币);
token
指向堆栈上的buffer
。因此,无需释放它。
另一个错误是:
*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");
}
...
获取当前目录的小函数:
void get_working_dir(void)
{
char buf[PATH_MAX];
if (getcwd(buf, sizeof(buf)) == NULL) {
fprintf(stderr, "Err.:(%d) - %s: curr. workdirn", errno,strerror(errno));
exit(EXIT_FAILURE);
}
/* print current directory */
printf("%sn", buf);
}
调用函数:
get_working_dir();
我遇到了同样的问题,所以我看了一下手册页,据说 getcpw() 系统调用如果它是 NULL 的,则会对缓冲区进行恶意定位。 我认为问题是您的缓冲区未为空,因此请尝试使用 NULL 指针初始化它
char *buff=NULL;
buff=getcwd(buff,PATH_MAX);