我在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.hstrcspn()时,存在此问题。

在一个单独的项目中,问题有时存在,但不是在x64中显示4的结果,而是在Win32中显示,而在x64中显示6。在同一项目的另一个文件中,问题与上述相同。它似乎是某种类型的UB,但显然给出的代码可以重现此问题,据我所知,我在这里没有介绍任何UB。

编辑:经过进一步测试后,使用cout而不是printf返回的值也为0和1。

最佳答案

strcspn需要将以null结尾的字符串作为两个参数的指针,您需要按以下方式修复代码。

char delimiter_[] = ",";
printf( "%d\n", strcspn( css_.c_str(  ), delimiter_ ) );

10-02 01:51