【发布时间】:2011-11-16 09:35:25
【问题描述】:
我知道 C 是有目的的准系统,但我很好奇为什么
难道没有一种“足够正确”的方法可以做到这一点吗?太多特定领域的要求?任何人都可以解释一下吗?
顺便说一句,这是我经过一番研究后提出的子字符串函数。 编辑:我根据 cmets 做了一些更新。
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';
}
编辑:根据 r 的评论,我也想出了这个班轮。不过,你自己来检查!
#define substr(dest, src, startPos, strLen) snprintf(dest, BUFF_SIZE, "%.*s", strLen, src+startPos)
【问题讨论】:
-
不会
strncpy让你做同样的事情吗? -
任何询问“为什么 X 标准不包括功能 Y”的问题都很难明确回答。
-
strncpy并不像您认为的那样。我个人在这里使用memcpy。 (另外,size_t类型更适合数组索引和大小。) -
如果您向 10 个 C 程序员询问通用子字符串函数的规范,您可能会得到 10 个不同的答案。它应该分配内存吗?它应该允许负索引吗?我们是否需要一个 substringn 函数来获取目标缓冲区的长度?等等
-
@Tom:
strncpy不太可能是任何特定问题的正确答案。