c - 使用 strncpy 删除 char* 的一部分

标签 c strncpy

我正在尝试使用 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|"

我想要做的是从修剪中删除代码的后部。到目前为止我得到了这个:

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。

我是否可以解决这个问题或找到更好的方法来修剪这个 char* 以实现我的目标?

最佳答案

这是一种适用于分隔符列表的方法,类似于 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 不支持;您需要自己编写代码)。不要忘记释放使用完毕后返回的指针:

char *extractPrefix(const char *buf, const char *dividers)
{
    size_t div_idx = strcspn(buf, dividers);
    return strndup(buf, div_idx);
}

或者,您也可以只返回字符数(如果 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");

显然您有多种选择。这实际上取决于您想使用哪一个。

关于c - 使用 strncpy 删除 char* 的一部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35831112/

相关文章:

c - 在 C 中的数组定义中使用宏

c - 如何返回结构类型的函数的返回值?

改变静态数组

C - strncpy 用法 - 段错误

c - 是否可以找出变量名,指向的指针?

c - 在 execvp 之前设置 gid,但 id 命令显示多个组

c - 释放双指针

C strncpy 没有空终止的原因

c - 为什么我不能在 C 中使用函数参数作为数组大小?

c - 打印函数变量时打印输出不同