这可能是基本的,请耐心等待我,
char data[]="(xxx)";
我想删除()并将数据仅保留为xxx
,
char *p = strtok(data,"(");
p = strtok(NULL,")");
printf("this data: %s \n",p);
printf("this data: %s \n",data);
xxx
答案 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,"(");
它会:
\0
。由于第二步失败(没有更多分隔符),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;
}