C - 在字符串的前n个字符后获取子字符串

时间:2017-02-09 20:26:39

标签: c string substring c-strings

事实证明这很难做到,而且我还没有找到一个直截了当的解决方案来查看现有问题。我看过几个重复的问题,但它们并不是我想要的。

我尝试过这样的事情,但我显然误解了strncpy的工作原理。我希望在字符串的前14个字符之后

int length = sizeof(str) - 14;
strncpy(substr, str+14, length);

这样做最简单的方法是什么?

3 个答案:

答案 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);
}