我在Visual Studio 2012中的strcspn()
中遇到了这个奇怪的问题。
当我将以下代码编译为32位Win32控制台应用程序时,得到的预期结果为6。
#include <string>
#include <iostream>
#include <cstring>
int main( int argc, char **argv )
{
char delimiter_ = ',';
std::string css_ = "ESCAPE,,0,0";
printf( "%s\n", css_.c_str( ) );
printf( "%d\n", strcspn( css_.c_str( ), &delimiter_ ) );
size_t lengthOfField = strcspn( css_.c_str( ), &delimiter_ );
printf( "%d\n", lengthOfField );
std::cin.get( );
return 0;
}
但是,如果我为x64编译相同的代码,则会得到4的意外结果。是我不应该这样做还是VS2012中的错误?
使用
cstring
方法使用string.h
或strcspn()
时,存在此问题。在一个单独的项目中,问题有时存在,但不是在x64中显示4的结果,而是在Win32中显示,而在x64中显示6。在同一项目的另一个文件中,问题与上述相同。它似乎是某种类型的UB,但显然给出的代码可以重现此问题,据我所知,我在这里没有介绍任何UB。
编辑:经过进一步测试后,使用
cout
而不是printf
返回的值也为0和1。 最佳答案
strcspn需要将以null结尾的字符串作为两个参数的指针,您需要按以下方式修复代码。
char delimiter_[] = ",";
printf( "%d\n", strcspn( css_.c_str( ), delimiter_ ) );