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

C - Get substring after first n characters of string

这被证明是非常困难的,而且我还没有通过现有的问题找到一个简单的解决方案。我查看了几个重复的问题,但它们不是我要找的。

我试过类似的方法,但我显然误解了 strncpy 的工作原理。我想在字符串的前 14 个字符 之后获取文本的 all

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

最简单的方法是什么?

您是不是误解了数学的原理? 10 - 14 = -4

编辑:

有一个

char str[10];
int length = sizeof(str) - 14;

完整 post。 (查看编辑内容

此外,您不应使用 sizeof 来计算字符串的长度,请使用 strlen()sizeof 运算符用于找出类型的大小,假设 str 是一个数组或指针 sizeof 将 return 第一种情况下的元素数量和指针的大小相当于秒中的 sizeof(void *)

一个字符串是一个数组,但是这个数组的大小不是字符串的长度,一个10个字符的字符串可以存入一个100个元素的数组,所以问题不是strncpy你应该避免顺便说一句,因为它不能保证nul终止),真正的问题是你如何处理它。

假设你有一个长度≥14的有效字符串,那么

strcpy(substr, str + 14)

应该够了吧!

你应该确保目标数组substr当然足够大并且str的长度大于或等于14或者,在这两种情况下,您都会调用未定义的行为。

如果你之前知道str的长度,那么你可以试试

memcpy(substr, str + 14, length_str - 14);
substr[length_str - 14] = '[=12=]';

请注意,substr 必须至少有 length_str - 14 个元素 +1 用于 nul 终止符,并且如果您知道 '[=28=]' 终止符 str,然后

// Leaving + 1 explicitly to denote the '[=13=]'
memcpy(substr, str + 14, length_str - 14 + 1);

应该在一次调用中复制它。

I've tried something like this, but I'm clearly misunderstanding how strncpy works. I want to get all of the text after the first 14 characters of the string.

int length = strlen(str) - 14;
if(length >= 0) {
   strncpy(substr, str+13, length);
   substr[length] = '[=10=]';
}

您的尝试有两个问题:

  • sizeof(str) 不计算 str 指向的字符串中的字符数。它的计算结果为 str 的大小,它可以是指针或数组,因为您没有 post 定义。为此,您应该使用 strlen(str)

  • strncpy() 并不像你想象的那样。这个函数非常容易出错。它从来都不是适合任何工作的工具,请不要使用它。

解决方法很简单:如果你知道 str 至少有 14 个字符并且 substr 指向一个足够长的数组来接收字符串的其余部分,只需这样写:

strcpy(substr, str + 14);  // copy all characters, skipping the first 14 bytes

如果str可能少于14个字符,添加测试:

*substr = '[=11=]';
if (strlen(str) >= 14) {
    strcpy(substr, str + 14);
}

如果您知道目标的大小,但不知道它是否足够大以接收字符串的其余部分,请使用:

*substr = '[=12=]';
if (strlen(str) >= 14) {
    snprintf(substr, substr_size, "%s", str + 14);
}

或者这个选择:

*substr = '[=13=]';
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);
}