gpt4 book ai didi

c++ - 为什么这适用于 Visual C++,但不适用于 gcc?

转载 作者:太空狗 更新时间:2023-10-29 23:48:06 24 4
gpt4 key购买 nike

过去几个月我一直在从事一个高级项目,我们团队开发过程中的一个主要症结是处理 Visual-C++ 和 gcc 之间的分歧。 (是的,我知道我们都应该拥有相同的开发环境。)至此事情差不多结束了,但我今天遇到了一个中等错误,这让我想知道 Visual-C++ 是否对新手(比如我)更容易通过设计。

在我的一个 header 中,有一个函数依赖于 strtok 来分割字符串,进行一些比较并返回具有相似格式的字符串。它的工作原理类似于以下内容:

int main()  
{
string a, b, c;
//Do stuff with a and b.
c = get_string(a,b);
} <br/><br/>
string get_string(string a, string b)
{
const char * a_ch, b_ch;
a_ch = strtok(a.c_str(),",");
b_ch = strtok(b.c_str(),",");
}

strtok 因擅长标记化而臭名昭著,但同样擅长破坏要标记化的原始字符串。因此,当我用 gcc 编译它并尝试用 ab 做任何事情时,我得到了意想不到的行为,因为使用的分隔符在字符串中被完全删除了。这是一个例子,以防我不清楚;如果我设置 a = "Jim,Bob,Mary"b="Grace,Soo,Hyun",它们将被定义为 a="JimBobMary"b="GraceSooHyun" 而不是像我想要的那样保持不变。

但是,当我在 Visual C++ 下编译它时,我取回了原始字符串并且程序执行正常。

我尝试为字符串动态分配内存并以“标准”方式复制它们,但唯一可行的方法是使用 malloc()free(),我听说在 C++ 中不鼓励这样做。虽然我对此很好奇,但我真正的问题是:为什么程序在用 VC++ 编译时可以运行,但用 gcc 编译却不行?

(这是我在尝试使代码跨平台时遇到的许多冲突之一。)

提前致谢!

-卡洛斯·努涅斯

最佳答案

这是一个未定义行为的例子。您正在将 string::c_str() 的结果(一个 const char*)传递给 strtok,后者接受一个 char*。通过修改 std::string 数据的内容,您将调用未定义的行为(除非您正在转换,否则您应该收到警告)。

你什么时候检查a和b的值?在 get_string 中,还是在 main 中? get_string 传递的是 a 和 b 的拷贝,因此 strtok 很可能不会更改 main 中的原件。但是,它可以,因为您正在调用未定义的行为。

“正确的方法”是使用 malloc/free 或 new[]/delete[]。您正在使用 C 函数,因此您已经犯了与使用 malloc/free 相同的罪行。一种相对优雅但安全的方法是:

char *ap = strdup(a.c_str());
const char *a_ch = strtok(ap, ",");
/* do whatever it is you do */
free(ap);

还要记住 strtok 使用全局状态,因此它不能很好地处理线程。

关于c++ - 为什么这适用于 Visual C++,但不适用于 gcc?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2619830/

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