使用 strncpy 删除 char* 的一部分
Using strncpy to remove part of a char*
我正在尝试使用 strncpy 删除字符串的特定部分,但我遇到了一些问题。
这是我的 2 char* 所具有的。
trimmed has for example "127.0.0.1/8|rubbish|rubbish2|" which is a
prefix of a address.
backportion contains "|rubbish|rubbish2|"
我想做的是从 trimmed 中删除代码的反向部分。到目前为止我得到了这个:
char* extractPrefix(char buf[1024]){
int count = 0;
const char *divider = "|";
char *c = buf;
char *trimmed;
char *backportionl;
while(*c){
if(strchr(divider,*c)){
count++;
if(count == 5){
++c;
trimmed = c;
//printf("Statement: %s\n",trimmed);
}
if(count == 6){
backportionl = c;
}
}
c++;
}
strncpy(trimmed,backportionl,sizeof(backportionl));
printf("Statement 2: %s\n", trimmed);
这让我犯了一个错误,即 backportionl 是一个 char* 而不是一个 char。
有没有什么方法可以解决这个问题,或者找到更好的方法 trim 这个 char* 来达到我的目标?
免责声明:我不确定我是否正确理解了您真正想要实现的目标。一些示例可能会有所帮助。
I am trying to remove a certain part of my string [..]
我不知道您在代码中尝试什么,但是使用 strstr
, strlen
and memmove
:
很容易实现
首先,使用 strstr
找到要删除的字符串的位置。然后将找到的字符串后面的内容复制到找到的字符串开始的位置。
char cut_out_first(char * input, char const * unwanted) {
assert(input); assert(unwanted);
char * start = strstr(input, unwanted);
if (start == NULL) {
return 0;
}
char * rest = start + strlen(unwanted);
memmove(start, rest, strlen(rest) + 1);
return 1;
}
好吧,这很愚蠢,但我基本上在一行中解决了我的问题。所以,
trimmed[strchr(trimmed,'|')-trimmed] = '[=10=]';
printf("Statement 2: %s\n", trimmed);
因此,通过使用 strchr 从修剪后的 char* 中获取 'backportion' 的索引,我能够有效地解决问题。
感谢互联网,不多。
这是一种适用于分隔符列表的方法,类似于 strtok
第一次调用时的工作方式:
char *extractPrefix(char *buf, const char *dividers)
{
size_t div_idx = strcspn(buf, dividers);
if (buf[div_idx] != 0)
buf[div_idx] = 0;
return buf;
}
如果您不想修改原始缓冲区,可以使用strndup
,假设您的平台支持该功能(Windows不支持;您需要自己编写代码) .完成后不要忘记 free
returned 的指针:
char *extractPrefix(const char *buf, const char *dividers)
{
size_t div_idx = strcspn(buf, dividers);
return strndup(buf, div_idx);
}
或者,您可以只 return 字符数(如果前缀中的字符数不适合 int
,则可以是小于 0 的某个值):
int pfxlen(const char *buf, const char *dividers)
{
size_t div_idx = strcspn(buf, dividers);
if (div_idx > (size_t)INT_MAX)
return -1;
return (int)div_idx;
}
并像这样使用它:
int n;
const char *example = "127.0.0.1/8|rubbish|rubbish2|";
n = pfxlen(example, "|");
if (n >= 0)
printf("Prefix: %.*s\n", n, example);
else
fprintf(stderr, "prefix too long\n");
显然您有多种选择。使用哪一个完全取决于您。
我正在尝试使用 strncpy 删除字符串的特定部分,但我遇到了一些问题。
这是我的 2 char* 所具有的。
trimmed has for example "127.0.0.1/8|rubbish|rubbish2|" which is a prefix of a address.
backportion contains "|rubbish|rubbish2|"
我想做的是从 trimmed 中删除代码的反向部分。到目前为止我得到了这个:
char* extractPrefix(char buf[1024]){
int count = 0;
const char *divider = "|";
char *c = buf;
char *trimmed;
char *backportionl;
while(*c){
if(strchr(divider,*c)){
count++;
if(count == 5){
++c;
trimmed = c;
//printf("Statement: %s\n",trimmed);
}
if(count == 6){
backportionl = c;
}
}
c++;
}
strncpy(trimmed,backportionl,sizeof(backportionl));
printf("Statement 2: %s\n", trimmed);
这让我犯了一个错误,即 backportionl 是一个 char* 而不是一个 char。
有没有什么方法可以解决这个问题,或者找到更好的方法 trim 这个 char* 来达到我的目标?
免责声明:我不确定我是否正确理解了您真正想要实现的目标。一些示例可能会有所帮助。
I am trying to remove a certain part of my string [..]
我不知道您在代码中尝试什么,但是使用 strstr
, strlen
and memmove
:
首先,使用 strstr
找到要删除的字符串的位置。然后将找到的字符串后面的内容复制到找到的字符串开始的位置。
char cut_out_first(char * input, char const * unwanted) {
assert(input); assert(unwanted);
char * start = strstr(input, unwanted);
if (start == NULL) {
return 0;
}
char * rest = start + strlen(unwanted);
memmove(start, rest, strlen(rest) + 1);
return 1;
}
好吧,这很愚蠢,但我基本上在一行中解决了我的问题。所以,
trimmed[strchr(trimmed,'|')-trimmed] = '[=10=]';
printf("Statement 2: %s\n", trimmed);
因此,通过使用 strchr 从修剪后的 char* 中获取 'backportion' 的索引,我能够有效地解决问题。
感谢互联网,不多。
这是一种适用于分隔符列表的方法,类似于 strtok
第一次调用时的工作方式:
char *extractPrefix(char *buf, const char *dividers)
{
size_t div_idx = strcspn(buf, dividers);
if (buf[div_idx] != 0)
buf[div_idx] = 0;
return buf;
}
如果您不想修改原始缓冲区,可以使用strndup
,假设您的平台支持该功能(Windows不支持;您需要自己编写代码) .完成后不要忘记 free
returned 的指针:
char *extractPrefix(const char *buf, const char *dividers)
{
size_t div_idx = strcspn(buf, dividers);
return strndup(buf, div_idx);
}
或者,您可以只 return 字符数(如果前缀中的字符数不适合 int
,则可以是小于 0 的某个值):
int pfxlen(const char *buf, const char *dividers)
{
size_t div_idx = strcspn(buf, dividers);
if (div_idx > (size_t)INT_MAX)
return -1;
return (int)div_idx;
}
并像这样使用它:
int n;
const char *example = "127.0.0.1/8|rubbish|rubbish2|";
n = pfxlen(example, "|");
if (n >= 0)
printf("Prefix: %.*s\n", n, example);
else
fprintf(stderr, "prefix too long\n");
显然您有多种选择。使用哪一个完全取决于您。