我正在创建一个DataStage并行例程,这是一个C或C++函数,从IBM(以前是Ascential)DataStage中调用。如果传递进来的字符串中有一个是零长度,那么它就会失败。如果我把这个放在函数的第一行。
return strlen(str);
那么对于那些将空值传入str的调用,它将返回0。然而,如果我在函数的第一行写上这句话... ...
if (strlen(str)==0) {return 0;}
那么它就不会返回,而是进入一个无限循环。
我很困惑--在测试线束中可以正常工作,但在DataStage中却不行。
也许DataStage将空字符串传递给C例程的方式有些奇怪?
int pxStrFirstCharList(char *str, char *chars )
{
if (strlen(str)==0) {return 0;}
if (strlen(chars)==0) {return 0;}
int i = 0;
//Start search
while (str[i]) //for the complete input string
{
if (strchr(chars, str[i]))
{
return i+1;
}
++i;
}
return 0;
}
你所做的事情有一个内置的函数,它被称为 strcspn
. 这个函数接收两个字符串,并搜索第一个字符串中任何字符的首次出现。
我建议使用这个函数比RYO...
这个怎么样?
int pxStrFirstCharList(char *str, char *chars )
{
if (str && chars && (0 != strlen(str)) && (0 != strlen(chars)))
{
int i = 0;
//Start search
while (str[i]) //for the complete input string
{
if (strchr(chars, str[i]))
{
return i+1;
}
++i;
}
}
return 0;
}
另外,我也不太明白这一点。while
循环......(不,我不是说这可以写为 for
). 我的意思是,一方面你在做一个搜索(strstr
),它本身将被实现为一个循环,但你仍然有一些外部循环。难道你真的想让 chars
在其位,即......?
int pxStrFirstCharList(char *str, char *chars )
{
if (str && chars && (0 != strlen(str)) && (0 != strlen(chars)))
{
int i = 0;
//Start search
while (chars[i]) //for the complete input string
{
if (strchr(str, chars[i]))
{
return i+1;
}
++i;
}
}
return 0;
}
...? 就是说,要寻找每一个字里面的? chars
字符串内 str
...
如果NULL不是游戏中显式的一部分,至少在开发阶段,对函数接收到的指针增加一个前提条件检查总是一个好主意。
int pxStrFirstCharList(char *str, char *chars )
{
if (!str)
return -1;
if (!chars)
return -2;
....
(负值-1和-2会告诉调用者有问题)
或者用更轻松的方式来做,默默地接受NULL指针字符串为""-string。
int pxStrFirstCharList(char *str, char *chars )
{
if (!str)
return 0;
if (!chars)
return 0;
...
如果你是唯一一个使用这个API的人,你可以... #ifndef BUILD_RELEASE
如果有什么东西测试稳定的话,这些检查去做一个版本构建。
我想这是字符串长度为0的时候strlen的问题,比如。
char s1[0];char *s2="a";
printf("%d %s/d/sn", sizeof(s1), s1);/0 @。
printf("%d %s/sn", strlen(s1), s1);/3 @。
printf("%d %s/d/sn", sizeof(s2), s2);/8 a。
printf("%d %s/sn", strlen(s2), s2);/ 1 a。
你使用strlen会得到一个奇怪的答案,你可以详细查看它的源代码(https:/code.woboq.org用户空间glibcstringstrlen.c.html。). 简而言之,你可以用sizeof代替strlen来表示char字符串,或者用strlen来避免0长度的情况。