gpt4 book ai didi

c - strtok 没有正确分割字符串

转载 作者:太空宇宙 更新时间:2023-11-03 23:46:03 25 4
gpt4 key购买 nike

当我将“/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;
}

调用tokenised的函数,有问题

  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 开始处理之前被截断。您可以通过在 tokenised() 函数开头打印 directories 字符串来确认这一点。

由于你在其他地方使用了strdup,所以把上面几行改成

char* pathBuffer = strdup(PATH);

将解决问题。

关于c - strtok 没有正确分割字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33411232/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com