gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 08:10:18 25 4
gpt4 key购买 nike

我知道 C 是有目的的准系统,但我很好奇为什么 中没有包含像子字符串函数这样常见的东西。

是否没有一种“足够正确”的方法来做到这一点?领域特定要求太多?任何人都可以阐明吗?

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

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)

最佳答案

基本的标准库函数不会给自己带来过多昂贵的安全检查负担,而是将它们留给用户。您在实现中执行的大多数安全检查都是昂贵的:在这样一个基本的库函数中是完全不能接受的。这是 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;
}

虽然 strlcpy 不是标准库的一部分,但它可以被粗略地替换为[误用的] 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;
}

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

关于c - 为什么 substring 不是 C 标准库的一部分?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7406219/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com