strlen несовместим со строкой нулевой длины - PullRequest
1 голос
/ 25 ноября 2011

Я создаю параллельную подпрограмму DataStage, которая представляет собой функцию C или C ++, которая вызывается из IBM (ранее Ascential) DataStage.Сбой, если одна из переданных строк имеет нулевую длину.Если я помещу это в самую первую строку функции:

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

Ответы [ 3 ]

1 голос
/ 25 ноября 2011

Есть встроенная функция для того, что вы делаете, она называется strcspn. Эта функция принимает две строки и ищет в первой строку первое вхождение любого из символов второй строки.

Я предлагаю использовать это, чем RYO ...

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

0 голосов
/ 25 ноября 2011

Если 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 проверить эти данные для сборки релиза, если что-то будет стабильно протестировано.

0 голосов
/ 25 ноября 2011

Как насчет этого?

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 ...

...