1

私はDataStage並列ルーチンを作成しています。これは、IBM(以前のAscential)DataStage内から呼び出されるCまたはC++関数です。渡された文字列の1つが長さがゼロの場合は失敗します。これを関数の最初の行に置くと、次のようになります。

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ます。この関数は 2 つの文字列を取り、最初の文字列を検索して、2 番目の文字列のいずれかの文字の最初の出現を探します。

私はRYOよりそれを使用することをお勧めします...

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

于 2011-11-25T14:44:36.707 に答える
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

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 に答える