strlen与零长度字符串不一致 < >我创建了一个DATASTAGE并行例程,它是从IBM(以前的Actudio)数据存储中调用的C或C++函数。如果传入的字符串中有一个长度为零,则失败。如果我把它放在函数的第一行: return strlen(str); int pxStrFirstCharList(char *str, char *chars ) { if (!str) return -1; if (!chars) return -2; ....

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

然后,对于将空值传递到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;
}
这个怎么样

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如果你链接