为什么substring不是C标准库的一部分?

Der*_*ger 2 c substring substr

我知道C是故意的,但是我很好奇为什么像<string.h>中没有包含像substring函数那样普通的东西.

难道没有一种"足够"的方式来做到这一点吗?域特定要求太多?谁能摆脱任何光明?

顺便说一句,这是我在经过一些研究后提出的子串函数.编辑:我根据评论做了一些更新.

void substr (char *outStr, const char *inpStr, int startPos, size_t strLen) {
    /* Cannot do anything with NULL. */
    if (inpStr == NULL || outStr == NULL) return;

    size_t len = strlen (inpStr);

    /* All negative positions to go from end, and cannot
    start before start of string, force to start. */
    if (startPos < 0) {
        startPos = len + startPos;
    }
    if (startPos < 0) {
        startPos = 0;
    }

    /* Force negative lengths to zero and cannot
    start after end of string, force to end. */
    if ((size_t)startPos > len) {
        startPos = len;
    }

    len = strlen (&inpStr[startPos]);
    /* Adjust length if source string too short. */
    if (strLen > len) {
        strLen = len;
    }

    /* Copy string section */
    memcpy(outStr, inpStr+startPos, strLen);
    outStr[strLen] = '\0';
}
Run Code Online (Sandbox Code Playgroud)

编辑:基于来自r的评论我也提出了这一个班轮.你可以自己做检查!

#define substr(dest, src, startPos, strLen) snprintf(dest, BUFF_SIZE, "%.*s", strLen, src+startPos)
Run Code Online (Sandbox Code Playgroud)

AnT*_*AnT 6

基本的标准库函数不会给昂贵的安全检查带来负担,而是将它们留给用户.您在实施中执行的大多数安全检查都是昂贵的:在这种基本库函数中完全不可接受.这是C,而不是Java.

一旦你从图片中得到一些检查,"substrung"功能归结为普通strlcpy.即无视安全检查startPos,您需要做的就是

char *substr(const char *inpStr, char *outStr, size_t startPos, size_t strLen) {
  strlcpy(outStr, inpStr + startPos, strLen);
  return outStr;
}
Run Code Online (Sandbox Code Playgroud)

虽然strlcpy不是标准库的一部分,但它可以被[misused]粗略地取代strncpy.再次,忽略安全检查startPos,您需要做的就是

char *substr(const char *inpStr, char *outStr, size_t startPos, size_t strLen) {
  strncpy(outStr, inpStr + startPos, strLen);
  outStr[strLen] = '\0';
  return outStr;
}
Run Code Online (Sandbox Code Playgroud)

具有讽刺意味的是,在你的代码strncpy中以同样的方式被滥用.最重要的是,许多安全检查是您选择签名类型(int)来表示索引的直接结果,而正确的类型将是无符号类型(size_t).