从原始字符串中删除字符?

时间:2016-07-31 13:57:54

标签: c

这可能是基本的,请耐心等待我,

char data[]="(xxx)";

我想删除()并将数据仅保留为xxx

char *p = strtok(data,"(");
p = strtok(NULL,")");
printf("this data: %s \n",p);
printf("this data: %s \n",data);
  1. p应该是xxx但是它的NULL,数据保持不变(strtok会影响源吗?)
  2. 这不会改变数据,我想要一种操纵数据的方法xxx

5 个答案:

答案 0 :(得分:3)

怎么样

memmove(data, data + 1, sizeof data - 1);  // Removes the (
data[strlen(data) -1] = '\0';  // Removes the )

请注意,上述解决方案仅适用于最初显示的数据,带有前导和尾随括号。它只有在data实际上是数组而不是指针时才有效。数组data需要在可修改的内存中(例如RAM)。

另请注意,是满足了段落中的要求,那么这两个陈述的顺序无关紧要。

答案 1 :(得分:1)

它是一个char [],而不是字符串。你可以尝试这样的事情:

import com.neura.standalonesdk.util;

SDKUtils.isConnected(getApplicationContext(), mNeuraApiClient);

这可能仅适用于"("和")"在你的char *

的末尾

答案 2 :(得分:1)

char *in_parens(char* str) {
   char *end, *start;
   if (!(end = strrchr(str, ')'))) return NULL;
   if (!(start = strchr(str, '('))) return NULL;
   *end = '\0';
   return start + 1;
}

int main(void) {
    char data[] = "a(x(b)x)c";
    printf("%s\n", in_parens(data)); // prints x(b)x
}

如果字符串不包含NULL对,则返回()。否则,剥离最外面的对并返回内部的内容。

答案 3 :(得分:0)

您的代码无效,因为strtok无法按照您的想法运作。第一次这样叫时:

char *p = strtok(data,"(");

它会:

  1. 跳到第一个不是分隔符的字符。
  2. 然后尝试找到下一个分隔符。
  3. last 分隔符替换为\0
  4. 返回指向令牌的第一个字符的指针。
  5. 由于第二步失败(没有更多分隔符),strtok将只返回NULL,表示它没有找到任何令牌。对strtok进行同一输入的任何进一步调用也将返回NULL

    您可以通过在第一个调用中添加结束分隔符来更改此设置,如下所示:

    char *p = strtok(data,"()");
    

    现在strtok将找到一个令牌,并返回指向示例中第一个x的指针。但是请注意,由于它只用\0替换了终止分隔符,因此data中仍然存在开放性分析。

    要摆脱那个你可以做这样的事情:

    char *p = strtok(data,"()");
    strcpy(data, p);
    

    但是如果您在源数据中还有任何其他内容,我宁愿建议为结果构建一个新字符串。

答案 4 :(得分:-1)

代码有两个字符串,第一个是完整的字符串,另一个是要删除的字符。您可以指定()qwer

#include <string.h>
#include <stdio.h>
#include <stdlib.h>

char *strip_chars(const char *string, const char *chars)
{
    char * newstr = malloc(strlen(string) + 1);
    int counter = 0;

    for ( ; *string; string++) {
        if (!strchr(chars, *string)) {
            newstr[ counter ] = *string;
            ++counter;
        }
    }

    newstr[counter] = 0;
    return newstr;
}

int main()
{
    char *new = strip_chars("(xxx)", "()");
    printf("%s\n", new);

    free(new);
    return 0;
}