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);
}
这被证明是非常困难的,而且我还没有通过现有的问题找到一个简单的解决方案。我查看了几个重复的问题,但它们不是我要找的。
我试过类似的方法,但我显然误解了 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);
}