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