2012-03-14 12 views
-2

私は私が文字列の形式「[単語1]ワード2 [ワード3]」

であれば、私は認識する必要が '\0'

で終わる有効CStringのことを知っている入力文字列を持っています

" [ word1 ] word2 [ word3 ] " 

どのように文字列を得ることができますか?word1、word2、word3は変数になりますか?

char *word1,*word2,*word3; 
scanf(" [ %s ] %s [ %s ] ",word1,word2,word3); 

word1word2に似

何かがalphanumericalsの文字列であるexpresssionsです。

多分あり

私は私が使用して考えた

" [ word1 ] word2 [ word3 ] " 

と同様の問題を持っている私は、スペース

を入れている場所で、ホワイトスペース(タブとスペース)の任意の数strtok。それは私がこのような何かを試してみました

" [ word1 [ word2 [ word3 [ " 

" [ word1 ] word2 [ word3 ] " 

間と

分離しないだろうが、 str1str2は、同じ結果を得ました。

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

char * TrimWhiteSpaces(char *str) { 
char *out = str; 
int i; 
int len = strlen(str); 
for (i=0; i<len && isspace(str[i]); i++, out++); /*scan forward*/ 
for (i=len-1; i>=0 && isspace(str[i]); str[i]=0, i--);/*scan backward*/ 
return out; 
} 
char * GetTokenBetweenSquareBraces(char * input, char **output, int * output_size) { 
char *p = TrimWhiteSpaces(input); 
*output_size=0; 
if (p[0] == '[') 
{ 
    *output = TrimWhiteSpaces(p + 1); 
    do 
    { 
     (*output_size)++; 
    }while((*output)[*output_size] != ']' && isalnum((*output)[*output_size])); 
} 
else 
{ 
    return NULL; 
} 
return (*output) + *output_size; 
} 
char * GetTokenBtweenOpositeSquareBraces(char * input, char **output, int * output_size) { 
char *p = TrimWhiteSpaces(input); 
*output_size=0; 
if (p[0] == ']') 
{ 
    *output = TrimWhiteSpaces(p + 1); 
    do 
    { 
     (*output_size)++; 
    }while((*output)[*output_size] != '[' && isalnum((*output)[*output_size])); 
} 
else 
{ 
    return NULL; 
} 
return (*output) + *output_size; 
} 
    int GetWords(char * str,char * word1,char * word2,char * word3) 
{ 
char * next=NULL,*output=NULL; 

int outputsize; 
printf ("\nSplitting string \"%s\" into tokens:\n",str); 

next = GetTokenBetweenSquareBraces (str,&output,&outputsize); 
strncpy(word1,output,outputsize); 
word1[outputsize] = '\0'; 
strcpy(word1,TrimWhiteSpaces(word1)); 
if(!next) return 0; 

next = GetTokenBtweenOpositeSquareBraces (next,&output,&outputsize); 
strncpy(word2,output,outputsize); 
word2[outputsize] = '\0'; 
strcpy(word2,TrimWhiteSpaces(word2)); 

if(!next) return 0; 

next = GetTokenBetweenSquareBraces (next,&output,&outputsize); 
strncpy(word3,output,outputsize); 
word3[outputsize] = '\0'; 
strcpy(word3,TrimWhiteSpaces(word3)); 

if(!next) return 0; 

return 1; 
} 
void TestGetWords(char * str) 
{ 
char word1[20],word2[20],word3[20]; 
if (GetWords(str,word1,word2,word3)) 
{ 
    printf("|%s|%s|%s|\n",word1,word2,word3); 
} 
else 
{ 
    printf("3ViLLLL\n");  
} 

} 
int main() 
{ 
char str[] ="[ hello ] gfd [ hello2 ] "; 
char str2[] ="[ hello [ gfd [ hello2 ] "; 
char str3[] ="the [email protected]#"; 
char str4[] ="][123[]23][231["; 

TestGetWords(str); 
TestGetWords(str2); 
TestGetWords(str3); 
TestGetWords(str4); 
getchar(); 
return 1; 
} 

編集: P.S. すべてのコードは厳密なAnsi C89 Pedanticでなければなりません。

+2

独自のコードをいくつか表示してください。また、私はここに特定の質問が表示されません。 –

+0

私はそれをstrtokしようと言ったように。あまり成功することはありません。 – Nahum

+0

なぜ「文字列がフォーマットであるかを認識する必要がある」というのは本当の質問ではないのですか? 「文字列がフォーマットに適合するかどうかをどのように認識できますか?」という言い回しができます。 私の質問に何が間違っているのか本当に分かりませんか?なぜ人々は何の説明もせずにダウンボトム? 残念ながら、私は埋め込みマシンで作業し、スペースは非常に短いです。正規表現ライブラリは使用できません。 – Nahum

答えて

1

これあなたがが、完全ではなく、使い始めることがあります

const char *trim(const char *p) 
    { while(isspace(*p)) p++; return p; } 

int get_tok(const char * input, char *output, int output_size) { 
    const char *p = trim(input); 
    if (p[0] == '[') { 
    p = trim(p + 1); 
    while (isalnum(*p)) { 
     /* add *p to output */ 
     p++; 
    } 
    } else { 
    while (isalnum(*p)) { 
     /* add *p to output */ 
     p++; 
    } 
    } 
    return p - input; 
} 
+0

私はそのようなことを避けるために離れて見つけることを望みました。しかし、あなたは私に避難所のアイデアを与えた; tは、感謝の思いを! – Nahum

1

シンプルstate machineは通常、このような単純な構文解析タスクを処理するための最も簡単な方法です。