我正在编写一个程序,当在目录中执行时,将生成一个包含该目录中所有内容的文本文件。我正在获取从**argv
到main的目录路径,因为我正在使用netbeans和cygwin,我必须在char* get_path(char **argv)
函数中对获取的路径进行一些字符串操作。目录路径大小将始终不同因此我正在使用malloc分配空间以将其存储在内存中。
计划摘要:
#include <stdio.h>
#include <stdlib.h>
#include <dirent.h>
#include "dbuffer.h" //my own library
#include "darray.h" //my own library
ARR* get_dir_contents( char* path)
{
DBUFF *buff = NULL;
ARR *car = NULL;
DIR *dir_stream = NULL;
struct dirent *entry = NULL;
dir_stream = opendir(path);
if(opendir(path)==NULL) printf("NULL");
//... more code here
return car;
}
char* get_path(char **argv)
{
char *path = malloc(sizeof(char)* sizeof_pArray( &argv[0][11] ) + 3 );
strcpy(path, "C:");
strcat(path, &argv[0][11]);
printf("%s, sizeof: %d \n",path, sizeof_pArray(path));
return path;
}
int main(int argc, char** argv)
{
char *p = get_path(argv);
ARR *car = get_dir_contents(&p[0]);
//... more code here
return (EXIT_SUCCESS);
}
问题是我拥有的字符串没有初始化dir_stream
指针。我怀疑是因为指针和字符串文字之间存在一些差异,但我无法确定它究竟是什么。另外,dirent库函数期望DIR *opendir(const char *dirname);
const char 的事实可能与它有关。
输出:
C:/Users/uk676643/Documents/NetBeansProjects/__OpenDirectoryAndListFiles/dist/Debug/Cygwin_4.x-Windows/__opendirectoryandlistfiles, sizeof: 131
NULL
RUN FAILED (exit value -1,073,741,819, total time: 2s)
答案 0 :(得分:1)
这里有一些事情可能会出错 我建议做这样的事情
char* get_path(char *argv)
{
char *path = malloc(sizeof(char)* strlen(argv) );
if (path != NULL)
{
strcpy(path, "C:");
strcat(path, argv + 11);
printf("%s, sizeof: %d \n",path, strlen(path));
}
return path;
}
...
char* p = get_path(*argv);
注意:您不需要额外的3个字节,因为您分配的包括稍后跳过的11个字节。虽然没有11个字节的偏移量,你可能想要分解字符串然后将它们放在一起以便它可以移植。例如。使用strtok
您可以拆分该路径并替换您不需要的部分。
答案 1 :(得分:1)
这是关于argv的简单混淆吗?请插入以下行 就在你的main()的开头,这是你期望的吗?
printf("\n argv[0]== %s" , argv[0] );
getchar();
printf("\n argv[1]== %s" , argv[1] );
getchar();
好的,我们从argv [0]开始工作,请尝试使用get_path
char *get_path(char *argv)
{
int i=0;
// +2 to add the drive letter
char *path = malloc(sizeof(char)* strlen(argv)+2 );
if (path != NULL)
{
strcpy(path, "C:");
strcat(path, argv);
// we get the path and the name of calling program
printf("\n path and program== %s",path);
printf("%s, sizeof: %d \n",path, strlen(path));
// now remove calling program name
for( i=strlen(path) ; ; i--)
{
// we are working in windows
if(path[i]=='\\') break;
path[i]='\0';
}
}
return path;
}