gpt4 book ai didi

c - 为什么使用正确的参数类型调用 strtok() 时会失败?

转载 作者:行者123 更新时间:2023-11-30 20:55:37 26 4
gpt4 key购买 nike

我已将 C 程序中的问题追溯到对 strtok() 的调用。 (根据记录,其签名为 char *strtok(char *str, const char *delim) )。在尝试在一个非常简单的玩具程序中重现问题时,我遇到了困难 - 我传递了所有正确的参数类型,但每次尝试运行代码时都会出现总线错误。

这是程序:

#include <string.h>
#include <stdio.h>
#include <stdlib.h>

int main() {
char* tok;
char* str = "www.example.com";
const char* split = ".";

tok = strtok(str, split);
while(tok != NULL) {
printf("%s\n", tok);
tok = strtok(NULL, split);
}
}

奇怪的是,我发现声明 str作为数组 ( char str[] = "www.example.com" ) 并传递对 str 的引用最初的 strtok 调用( tok = strtok(&str, split) )似乎工作正常。

我并不真正担心这里的功能 - 使用数组的解决方案是有效的。我很好奇为什么原始实现使用指向 char 的指针,失败并抛出总线错误。

最佳答案

如果出现

 char* str = "www.example.com";
/// some code
tok = strtok(str, split);

您使用(指向)字符串文字作为第一个参数。由于 strtok() 可能会尝试更改传递给它的第一个参数的内容,因此您将面临 undefined behaviour .

引自man page

Be cautious when using these functions. If you do use them, note that:

These functions modify their first argument. [...]

以及关于尝试更改字符串文字,来自 C11,第 §6.4.5 章

[...] If the program attempts to modify such an array, the behavior is undefined

OTOH,如果您创建一个数组,使用字符串文字初始化它并将该数组传递给 strtok(),那就完全没问题,因为您的数组可以由您的程序修改。

关于c - 为什么使用正确的参数类型调用 strtok() 时会失败?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31994048/

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