当我将“ / usr / bin:/ bin:/ usr / sbin:/ sbin:/ usr / local / bin”传递给我的函数时,当我打印每个令牌时,我只会得到3个输出(而不是5个)。检查100次后,我看不到任何问题。但是每次只打印3个输出。
/ usr / bin
/箱
/ u / usr / bin
(空值)
char** tokenised(char* directories) {
char** directoryArray = malloc(1000*sizeof(char*));
char *token;
int i = 0;
//First token
token = strtok(directories, ":");
while(token != NULL)
{
directoryArray[i] = strdup(token);
token = strtok(NULL, ":");
i++;
}
int j = 0;
while(directoryArray[j] != NULL) {
printf("%s\n", directoryArray[j]);
j++;
}
return directoryArray;
}
调用标记化的函数,它有问题
int searchForFile(int argc, char *argv[]) {
char* fileName = argv[0];
char* pathBuffer = malloc(sizeof(PATH)+1);
strcpy(pathBuffer, PATH);
int i = 0;
printf("%s\n", PATH);
char** directoryArray = tokenised(pathBuffer);
printf("%s\n", directoryArray[4]);
while(directoryArray[i] != NULL) {
printf("%i\n", i);
printf("Searching directory: '%s'\n", directoryArray[i]);
//Form an address out 2 strings
char *address = malloc(sizeof(char)*strlen(directoryArray[i])+sizeof(char)*strlen(fileName)+1*sizeof(char));
strcpy(address, directoryArray[i]);
strcat(address, "/");
strcat(address, fileName);
argv[0] = address;
if(execute(argc, argv) == 0) {
return 0;
}
i++;
}
printf("Search for file: '%s' failed.", fileName);
return 1;
}
问题在于您的制作方式pathBuffer
。根据您的评论,PATH
是一个指针。因此,通话
char* pathBuffer = malloc(sizeof(PATH)+1);
strcpy(pathBuffer, PATH);
为一个指针加一个字节分配内存,而不是为PATH
指针的内容分配内存。将长输入字符串复制到此短缓冲区中会导致未定义的行为。字符串尾部的内存最有可能与其他一些数据结构共享,从而导致字符串在strtok
开始处理之前被截断。您可以通过directories
在tokenised()
函数开始处打印字符串来确认这一点。
由于您strdup
在其他地方使用,因此将上述几行更改为
char* pathBuffer = strdup(PATH);
将解决问题。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句