Rcpp函数中的nul字节字符

时间:2017-11-14 16:52:46

标签: r rcpp

我正在寻找一种比较重叠短字符串的方法。

我认为我可能会使用stringdist方法使用lcs方法找到合理的方法,但它似乎做了不同的事情。

此C标记的stackoverflow问题的已接受答案:

Detecting length of overlap between two strings

int overlap(const char *s1, const char *s2){
    int i = 0;
    while (*s1 != '\0' && *s2 != '\0') {
        if (*s1++ == *s2++) i++;
    }
    return i;
}

涉及使用nul字节字符来表示空字符串。

我怎么能把它翻译成Rcpp中有用的东西?当我尝试将其包裹在cppFunction中时,我收到一条错误消息,指出不允许使用此字符。

1 个答案:

答案 0 :(得分:1)

这是因为当你使用cppFunction来定义你的C ++函数时,你需要转义\,即如果你想在C ++代码中有\0,你需要在您为\\0提供的字符串中写下cppFunction

Rcpp::cppFunction( "
int overlap(const char* s1, const char* s2){

  int i = 0;
  while (*s1 != '\\0' && *s2 != '\\0') {
    if (*s1++ == *s2++) i++;
  }
  return i;

}")

这给了你:

> overlap( "foo", "foooo")
[1] 3

请注意,如果将函数放在.cpp文件中,则不需要这样做,这是建议的:

#include <Rcpp.h>
using namespace Rcpp ;

// [[Rcpp::export]]
int overlap(const char* s1, const char* s2 ){

  int i = 0;
  while (*s1 != '\0' && *s2 != '\0') {
    if (*s1++ == *s2++) i++;
  }
  return i;
}