我在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。
答案 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)
更容易编写。