2016-07-31 20 views
-2

これは基本的なことがあり、元の文字列から文字を削除しますか?

char *p = strtok(data,"("); 
p = strtok(NULL,")"); 
printf("this data: %s \n",p); 
printf("this data: %s \n",data); 
  1. pはする必要があり、私は唯一のxxxする()を削除し、データを残したい

    char data[]="(xxx)"; 
    

    、私と一緒に我慢してください。 xxxはNULLだが、データは同じままである(strtokはソースに影響を与えるだろうか?)

  2. これはデータを変更しない、データを操作する方法を希望するxxx
+1

a(xxx)b "'はどうですか? – a3f

+0

あなたが聞いていることはあまり明確ではない –

+0

@layzakは()で任意の単語を取り、元の単語から()を削除するだけです。 – Curnelious

答えて

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を返します。それ以外の場合は、最も外側のペアを削除し、内側のものを返します。

+0

偉大なthats私が必要なので、ちょうどそれを呼び出して、データを渡す?どうすれば元の "データ"配列をこれで変更できますか? – Curnelious

+0

はい、ただし、 'str'が変更されていることに注意してください。 – a3f

+0

どのようにデータを変更するためにそれを使用するかわかりません。 – Curnelious

3

どのように上記の溶液のみを先頭と末尾の括弧で、最初に提示されたデータ上で動作していることについて

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

注意。 dataが実際に配列でありポインタでない場合にのみ機能します。配列dataは変更可能なメモリ(RAMなど)にする必要があります。

また、段落の要件が満たされていることに注意してください.2つのステートメントの順序は関係ありません。

+0

エレガントなソリューション –

+0

'a(xxx)b'はどうですか? a3fはエレガントではありませんが、受け入れ可能です – snr

+0

私はmemmoveそのマイクロプロセッサ環境、他のオプションを使用することはできません? – Curnelious

1

文字列ではなく、char []です。あなたはこのような何かを試すことができます。

char new_Data[sizeof(data)/sizeof(char)]; 
for(i=1 ; i < sizeof(new_Data) ; i++){ 
     new_Data[i] = data[i]; 
} 

これはあなたの文字の末尾にあるだけで、「(」と「)」場合に動作するかもしれ*

+0

"文字列ではなくchar *です。" 1)OPはそれらのどちらも言及しなかったので、あなたは何について話していますか? 2)それは 'char * 'ではなく' char [] 'です。大きな違い。 –

+0

申し訳ありません。私はちょうど私の投稿を編集する –

+0

ありがとう、これは私の質問に答えていない、その新しいvar、そしてなぜstrtokはデータに影響を与えない? – Curnelious

-1

コードは最初の完全な1である2つの文字列を取ります、もう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; 
} 
0

strtokがあなたの思うように動作しないため、コードが機能しません。このように最初に呼び出されたとき:

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

はそれはします:

  1. は、区切り文字ではない最初の文字までスキップします。
  2. 次に、次の区切り文字を見つけようとします。
  3. 最後のの区切り文字を\0に置き換えます。
  4. トークンの最初の文字へのポインタを返します。

strtokは2つ目のデリミタがないので、単にトークンが見つからなかったことを示すNULLを返します。同じ入力に対してさらにstrtokを呼び出すと、NULLが返されます。あなたはこのような最初の呼び出しで終わる区切り文字を追加することによって、これを変更することができ

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

strtokは、トークンを見つけ、そしてあなたの例では最初のxへのポインタを返します。しかし、それは終了デリミタを\0に置き換えただけなので、オープニングの飾りはまだdataに存在します。あなたにも、ソースデータ内の他のコンテンツを持っている場合、私はむしろ、結果を新しい文字列を構築推薦しかし

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

:あなたはこのような何かを行うことができ、その1を取り除くために

関連する問題