strlen与零长度字符串不一致 < >我创建了一个DATASTAGE并行例程,它是从IBM(以前的Actudio)数据存储中调用的C或C++函数。如果传入的字符串中有一个长度为零,则失败。如果我把它放在函数的第一行: return strlen(str); int pxStrFirstCharList(char *str, char *chars ) { if (!str) return -1; if (!chars) return -2; ....
然后,对于将空值传递到str中的调用,它返回0。但是,如果我将其放在第一行strlen与零长度字符串不一致 < >我创建了一个DATASTAGE并行例程,它是从IBM(以前的Actudio)数据存储中调用的C或C++函数。如果传入的字符串中有一个长度为零,则失败。如果我把它放在函数的第一行: return strlen(str); int pxStrFirstCharList(char *str, char *chars ) { if (!str) return -1; if (!chars) return -2; ....,c,strlen,datastage,C,Strlen,Datastage,然后,对于将空值传递到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(cha
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;
}
这个怎么样
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;
}
另外,我不太明白循环的意义,而循环。。。(不,我不是说这可以写为
for
)。我的意思是,一方面,你正在做一个搜索(strstr
),它本身将被实现为一个循环,但你仍然有一些外部循环。您是否真的希望将字符
放在适当的位置,即:
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;
}
。。。?也就是说,在由str
表示的字符串中查找chars
中的每个字符。…这个怎么样
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;
}
另外,我不太明白循环的意义,而循环。。。(不,我不是说这可以写为
for
)。我的意思是,一方面,你正在做一个搜索(strstr
),它本身将被实现为一个循环,但你仍然有一些外部循环。您是否真的希望将字符
放在适当的位置,即:
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;
}
。。。?也就是说,在
str
表示的字符串中查找chars
中的每个字符。如果NULL不是游戏的明确部分,至少在开发阶段,最好在函数接收的指针上添加一个先决条件检查:
return strlen(str);
int pxStrFirstCharList(char *str, char *chars )
{
if (!str)
return -1;
if (!chars)
return -2;
....
(负值-1和-2会告诉打电话的人出了问题)
或者以一种更轻松的方式进行操作,默默地接受空指针字符串作为“-string:
如果你是唯一一个使用这个API的人,你可以
#ifndef BUILD\u RELEASE
检查发布版本是否测试稳定。如果NULL不是游戏的明确部分,至少在开发阶段,最好在函数接收的指针上添加一个先决条件检查:
return strlen(str);
int pxStrFirstCharList(char *str, char *chars )
{
if (!str)
return -1;
if (!chars)
return -2;
....
(负值-1和-2会告诉打电话的人出了问题)
或者以一种更轻松的方式进行操作,默默地接受空指针字符串作为“-string:
如果你是唯一一个使用这个API的人,你可以
#ifndef BUILD\u RELEASE
如果任何东西测试稳定,这些检查都会检查RELEASE BUILD。有一个内置函数用于你正在做的事情,它被称为strcspn
。此函数接受两个字符串,并在第一个字符串中搜索第二个字符串中第一个出现的任何字符
我建议用那个比RYO
有一个内置函数用于执行您正在执行的操作,它被称为
strcspn
。此函数接受两个字符串,并在第一个字符串中搜索第二个字符串中第一个出现的任何字符
我建议用那个比RYO
我想当字符串的长度为0时,这是strlen的问题。比如说, chars1[0]; char*s2=“a” printf(“%d%s\n”,大小为(s1),s1)//0@ printf(“%d%s\n”,strlen(s1),s1)//三,@ printf(“%d%s\n”,大小为(s2),s2)//8 a printf(“%d%s\n”,strlen(s2),s2);//1A
使用strlen会得到一个奇怪的答案,您可以详细检查它的源代码()。简而言之,您可以使用sizeof而不是strlen来表示char字符串,或者使用strlen来避免长度为0的情况。我猜字符串长度为0时,strlen的问题就在于此。比如说, chars1[0]; char*s2=“a” printf(“%d%s\n”,大小为(s1),s1)//0@ printf(“%d%s\n”,strlen(s1),s1)//三,@ printf(“%d%s\n”,大小为(s2),s2)//8 a printf(“%d%s\n”,strlen(s2),s2);//1A
使用strlen会得到一个奇怪的答案,您可以详细检查它的源代码()。简而言之,您可以使用sizeof而不是strlen来表示char字符串,或者使用strlen来避免长度为0的情况。您确定两个参数都不能是
NULL
IIRC,strlen()
在使用NULL
参数调用时调用UB。只是猜测一下,函数是否可能通过此类指针传递多字节字符?是否确定两个参数都不能是NULL
IIRC,strlen()
在使用NULL
参数调用时调用UB。只是猜测一下,函数是否可能通过这样的指针传递多字节字符?assert
宏已经用于此目的,它是一个更好的调试辅助工具,因为一旦检测到错误,它将中止程序,而不是继续执行错误状态。Phil,您可能希望对此答案进行评论,而不是将您的回复附加到帖子本身,然后将此答案标记为已接受。assert
宏已经存在用于此目的,它是一种更好的调试辅助工具,因为一旦检测到错误,它将中止程序,而不是继续以错误状态运行。Phil,您可能希望对此答案发表评论,而不是将您的回复附加到帖子本身,然后将此答案标记为已接受。+1如果您链接到的是一个好的引用,而不是网络上错误最多的引用之一。@R。。呵呵,我很确定上面的页面没有错误,TBH,man strcspn
确实是最好的选择!我怀疑一个人是否有错误(函数足够简单),但每当我看到人们给出糟糕的网站pagerank时,我都会退缩……为此,我可能会在函数中使用pagerank来替换核心逻辑,但我必须包装它,以便将其链接到DataStage。+1如果你链接