strlen与零长度字符串不一致

时间:2011-11-25 13:40:18

标签: c strlen datastage

我正在创建一个DataStage并行例程,它是从IBM(以前称为Ascential)DataStage中调用的C或C ++函数。如果传入的一个字符串是零长度则失败。如果我把它放在函数的第一行:

return strlen(str);

然后它返回0表示将空值传递给str的调用。如果我把它放在第一行,但是......

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;
}

4 个答案:

答案 0 :(得分:1)

你正在做的事情有一个内置函数,它被称为strcspn。此函数接受两个字符串,并在第一个字符串中搜索第二个字符串中任何字符的第一个出现。

我建议使用它而不是RYO ......

http://www.cplusplus.com/reference/clibrary/cstring/strcspn/

答案 1 :(得分: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;
}

另外,我并不完全明白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内的每个字符......

答案 2 :(得分:0)

如果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检查发布版本,如果有任何测试稳定的话。

答案 3 :(得分:0)

我猜想,当字符串的长度为0时,这是strlen的问题。例如,

字符s1 [0]; char * s2 =“ a”;

printf(“%d%s \ n”,sizeof(s1),s1); // 0 @

printf(“%d%s \ n”,strlen(s1),s1); // 3 @

printf(“%d%s \ n”,sizeof(s2),s2); // 8 a

printf(“%d%s \ n”,strlen(s2),s2); // 1个

使用strlen会得到一个奇怪的答案,您可以详细检查其源代码(https://code.woboq.org/userspace/glibc/string/strlen.c.html)。简而言之,对于char字符串,可以使用sizeof代替strlen,或者通过使用strlen避免使用0长度的情况。