Visual Studio 2012中strcspn的奇怪问题

时间:2013-04-21 18:45:12

标签: c++ visual-studio c++11 visual-studio-2012

我在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。

4 个答案:

答案 0 :(得分:3)

strcspn的第二个参数应该是一个空终止的c-string。你只是传递一个字符的地址。它将该单个字符视为c字符串的开头,向前扫描直到找到空终止符。但由于它不是一个c字符串,并且你在第一个字符之后没有任何字符的权限,因此它是未定义的行为。

答案 1 :(得分:3)

strcspn需要指向空终止字符串的指针作为两个参数,你需要修改代码如下。

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

答案 2 :(得分:1)

strcspn的参数应为C风格的字符串,而不是单个字符。

size_t strcspn( const char *dest, const char *src );

然后使用下面的

std::string delimiter_ = ",";

strcspn(css_.c_str(), delimiter.c_str());
                      ^^^^^^^^^^^^^^^^^

答案 3 :(得分:0)

css_.find(delimiter)更容易编写。