【发布时间】:2011-01-20 21:31:22
【问题描述】:
我一直在用一些 C 函数(例如最长公共子字符串算法)扩展 SAS 字符串处理。 proc FCMP 函数很容易变得非常低效。
proc proto 中的嵌入式 C 编译器在 Visual Studio 中编写算法后似乎没有产生我期望的结果。我认为我已经验证过的一件事是传递给 C 函数的字符串似乎被空格填充到大约 100 个字符的长度。
在我继续编写更多代码来推断字符串应该结束的位置之前,我想知道是否有人知道替代方法或一般可以分享有关为 SAS 编写 C 函数的想法?
这里有一些代码作为例子
/* C functions*/
proc proto package=sasuser.funcs.sfuncs;
/* A string length function */
int cslen(const char *s);
externc cslen;
int cslen(const char *s)
{
int i=0;
while (s[i++]!=0){}
return i-1;
}
externcend;
/* A char function */
int cschar(const char *s,const int pos);
externc cschar;
int cschar(const char *s,const int pos)
{
return s[pos];
}
externcend;
run;
option cmplib=sasuser.funcs;
/* SAS wrappers */
proc fcmp outlib=sasuser.funcs.sfuncs;
function slen(s $);
val=cslen(s);
return(val);
endsub;
function schar(s $,pos);
val=cschar(s,pos);
return(val);
endsub;
quit;
用
测试函数/* Tests */
data _null_;
length str $6.;
str="foobar";
len=slen(str);
firstchar=schar(str,0);
lastchar=schar(str,5);
shouldbenull=schar(str,6);
put _all_;
run;
给予
str=foobar len=91 firstchar=102 lastchar=114 shouldbenull=32 _ERROR_=0 _N_=1
编辑:我们会发现,您可以通过简单地修剪包装器中的字符串来解决这个问题,例如:
proc fcmp outlib=sasuser.funcs.sfuncs;
function slen(s $);
val=cslen(trim(s));
return(val);
endsub;
quit;
【问题讨论】: