strlen与零长度字符串不一致

问题描述 投票:1回答:4

我正在创建一个DataStage并行例程,这是一个C或C++函数,从IBM(以前是Ascential)DataStage中调用。如果传递进来的字符串中有一个是零长度,那么它就会失败。如果我把这个放在函数的第一行。

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;
}
c strlen datastage
4个回答
1
投票

你所做的事情有一个内置的函数,它被称为 strcspn. 这个函数接收两个字符串,并搜索第一个字符串中任何字符的首次出现。

我建议使用这个函数比RYO...

http:/www.cplusplus.comreferenceclibrarycstringstrcspn


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


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 如果有什么东西测试稳定的话,这些检查去做一个版本构建。


0
投票

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

char s1[0];char *s2="a";

printf("%d %s/d/sn", sizeof(s1), s1);/0 @。

printf("%d %s/sn", strlen(s1), s1);/3 @。

printf("%d %s/d/sn", sizeof(s2), s2);/8 a。

printf("%d %s/sn", strlen(s2), s2);/ 1 a。

你使用strlen会得到一个奇怪的答案,你可以详细查看它的源代码(https:/code.woboq.org用户空间glibcstringstrlen.c.html。). 简而言之,你可以用sizeof代替strlen来表示char字符串,或者用strlen来避免0长度的情况。

© www.soinside.com 2019 - 2024. All rights reserved.