事实证明这很难做到,而且我还没有找到一个直截了当的解决方案来查看现有问题。我看过几个重复的问题,但它们并不是我想要的。
我尝试过这样的事情,但我显然误解了strncpy
的工作原理。我希望在字符串的前14个字符之后 。
int length = sizeof(str) - 14;
strncpy(substr, str+14, length);
这样做最简单的方法是什么?
答案 0 :(得分:4)
你是否误解了数学是如何运作的? 10 - 14 = -4
修改强>
有一个
char str[10];
int length = sizeof(str) - 14;
在原帖中。 (查看编辑)
此外,您不应使用sizeof
来计算字符串的长度,请使用strlen()
。 sizeof
运算符用于查找类型的大小,假设str
是数组或指针sizeof
将返回第一种情况下的元素数和a的大小指针等效于第二个中的sizeof(void *)
。
字符串是一个数组,但是这个数组的大小不是字符串的长度,一个10个字符的字符串可以存储到100个元素的数组中,所以问题不是strncpy
(< em>你应该避免BTW,因为它不能保证nul
终止),真正的问题是你如何处理它。
假设您有一个长度≥14的有效字符串,那么
strcpy(substr, str + 14)
应该够了!
您应确保目标数组substr
当然足够大且str
的长度大于或等于 14 ,或者您可以两种情况都会调用未定义的行为。
如果您之前知道str
的长度,那么您可以尝试
memcpy(substr, str + 14, length_str - 14);
substr[length_str - 14] = '\0';
请注意,substr
length_str - 14
终结符必须至少有nul
个元素+1,如果您知道{{1}中有'\0'
个终结符然后
str
应该在一次通话中复制它。
答案 1 :(得分:1)
我尝试过这样的事情,但我明显误解了 strncpy有效。我希望在前14个之后获得所有文本 字符串的字符。
{{1}}
答案 2 :(得分:1)
您的尝试有两个问题:
sizeof(str)
不计算str
指向的字符串中的字符数。它的大小为str
,可能是指针或数组,因为您没有发布定义。您应该使用strlen(str)
来实现此目的。
strncpy()
不符合您的想法。此功能非常容易出错。对于任何工作来说,它永远不是正确的工具,不要使用它。
解决方案很简单:如果您知道str
至少包含14个字符且substr
指向数组的时间足以接收其余字符串,请写下:
strcpy(substr, str + 14); // copy all characters, skipping the first 14 bytes
如果str
可能少于14个字符,请添加测试:
*substr = '\0';
if (strlen(str) >= 14) {
strcpy(substr, str + 14);
}
如果你知道目的地的大小,但不知道它是否足够大以接收其余的字符串,请使用:
*substr = '\0';
if (strlen(str) >= 14) {
snprintf(substr, substr_size, "%s", str + 14);
}
或者这个替代方案:
*substr = '\0';
if (strlen(str) >= 14) {
// copy at most substr_size-1 characters from str, skipping the first 14 bytes.
// and null terminate the destination string.
strncat(substr, substr_size - 1, str + 14);
}