簡體   English   中英

strlen 與零長度字符串不一致

[英]strlen inconsistent with zero length string

我正在創建一個 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;
}

您正在執行的操作有一個內置函數,稱為strcspn 此函數采用兩個字符串,並搜索第一個字符串以查找第二個字符串中任何字符的第一次出現。

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

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

當字符串的長度為 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,或者使用 strlen 避免長度為 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;
}

……? 也就是說,在由str表示的字符串中查找chars每個chars ...

如果 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這些檢查是否有任何穩定的發布版本。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM