gpt4 book ai didi

C: strtok 返回第一个值,然后返回 NULL

转载 作者:太空宇宙 更新时间:2023-11-04 07:35:50 25 4
gpt4 key购买 nike

我只是想返回字符串中的每个单词,但 strtok 返回第一个单词,然后立即返回 null:

int main(int argc, char *argv[]) {

// Get the interesting file contents
char *filestr = get_file(argv[1]);

printf("%s\n", filestr);

char *word;

word = strtok(filestr, ";\"'-?:{[}](), \n");

while (word != NULL) {
word = strtok(NULL, ";\"'-?:{[}](), \n");
printf("This was called. %s\n", word);
}

exit(0);
}

get_file 只是打开指定路径并以字符串形式返回文件内容。上面显示的 printf("%s\n", filestr); 命令成功打印出任何给定文件的全部内容。因此,我认为 get_file() 不是问题所在。

如果我在 char test[] = "this is a test string" 而不是 filestr 上调用 strtok,那么它会正确返回每个单词。但是,如果我将 get_file() 获取的文件的内容设为“这是一个字符串”,那么它会返回“this”,然后返回 (null)。

应要求,这里是 get_file() 的代码:

// Take the path to the file as a string and return a string with all that
// file's contents
char *get_file (char *dest) {
// Define variables that will be used
size_t length;
FILE* file;
char* data;
file = fopen(dest, "rb");

// Go to end of stream
fseek(file, 0, SEEK_END);
// Set the int length to the end seek value of the stream
length = ftell(file);
// Go back to the beginning of the stream for when we actually read contents
rewind(file);

// Define the size of the char array str
data = (char*) malloc(sizeof(char) * length + 1);

// Read the stream into the string str
fread(data, 1, length, file);

// Close the stream
fclose(file);

return data;
}

最佳答案

你传递的是一个包含空字符的二进制文件吗?

get_file () 正确地返回一个字符缓冲区,但是(例如)如果我给你的函数一个 .png 文件,缓冲区看起来像这样

(gdb) p 数据[0] @32$5 = "\211PNG\r\n\032\n\000\000\000\rIHDR\000\000\003\346\000\000\002\230\b\006\000\000\000\376? "

可以看到PNG\r\n后面有空字符,所以不能真正把get_file()的返回值当成字符串。您需要将其视为字符数组并手动返回总长度,而不是依赖空终止。

然后,正如它目前所写的那样,您不能依赖 strtok,因为它会在遇到您的第一个空字符后停止处理。您可以通过传递您的数据并将所有空字符转换为其他内容来解决此问题,或者您可以实现一个适用于给定长度缓冲区的 strtok 版本。

关于C: strtok 返回第一个值,然后返回 NULL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9146427/

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