1

strcspn()在 Visual Studio 2012 中遇到了这个奇怪的问题。

当我将以下代码编译为 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 中的错误?使用其中一个cstringstring.h用于该strcspn()方法时存在此问题。

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

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

4

4 回答 4

3

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

于 2013-04-21T18:51:37.367 回答
3

strcspn 需要指向空终止字符串的指针作为两个参数,您需要按以下方式修复代码。

char delimiter_[] = ",";
printf( "%d\n", strcspn( css_.c_str(  ), delimiter_ ) );
于 2013-04-21T18:51:43.533 回答
1

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

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

然后在下面使用

std::string delimiter_ = ",";

strcspn(css_.c_str(), delimiter.c_str());
                      ^^^^^^^^^^^^^^^^^
于 2013-04-21T18:53:09.337 回答
0

css_.find(delimiter)写起来容易得多。

于 2013-04-21T19:03:00.410 回答