1

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

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

4 回答 4

1

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

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

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

于 2011-11-25T14:44:36.707 回答
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这些检查来检查发布版本(如果有任何测试稳定)。

于 2011-11-25T14:36:46.110 回答
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...表示的每个字符

于 2011-11-25T13:54:29.790 回答
0

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

字符 s1[0]; 字符 *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 a

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

于 2020-05-09T19:40:57.097 回答