使用strncpy删除部分char *

时间:2016-03-06 18:58:21

标签: c strncpy

我正在尝试使用strncpy删除字符串的某个部分,但我在这里面临一些问题。

这就是我的2 char *。

  

trimmed例如" 127.0.0.1/8 | rubbish | rubbish2 |"这是一个   地址的前缀。

     

backportion包含" | 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 *来实现我的目标吗?

3 个答案:

答案 0 :(得分:2)

这是一种适用于分隔符列表的方法,类似于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完成后返回的指针:

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");

显然你有很多选择。这取决于你想要使用哪一个。

答案 1 :(得分:0)

免责声明:我不确定我是否正确理解了您实际想要实现的目标。一些例子可能会有所帮助。

  

我正在尝试删除字符串的某个部分[..]

我不知道您在代码中尝试了什么,但使用strstrstrlenmemmove很容易实现这一点:

首先,使用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;
}

答案 2 :(得分:0)

Welp,这是愚蠢的,但我基本上在一行中解决了我的问题。所以这里,

trimmed[strchr(trimmed,'|')-trimmed] = '\0';
printf("Statement 2: %s\n", trimmed);

通过获得' backportion'的索引。从修剪过的char *使用strchr,我有效地解决了这个问题。

非常感谢互联网。