私は私が文字列の形式「[単語1]ワード2 [ワード3]」
であれば、私は認識する必要が'\0'
で終わる有効CStringのことを知っている入力文字列を持っています
" [ word1 ] word2 [ word3 ] "
どのように文字列を得ることができますか?word1、word2、word3は変数になりますか?
char *word1,*word2,*word3;
scanf(" [ %s ] %s [ %s ] ",word1,word2,word3);
word1
とword2
に似
何かがalphanumericalsの文字列であるexpresssionsです。
多分あり私は私が使用して考えた
" [ word1 ] word2 [ word3 ] "
と同様の問題を持っている私は、スペース
を入れている場所で、ホワイトスペース(タブとスペース)の任意の数strtok
。それは私がこのような何かを試してみました
" [ word1 [ word2 [ word3 [ "
" [ word1 ] word2 [ word3 ] "
間と
分離しないだろうが、
str1
と
str2
は、同じ結果を得ました。
#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でなければなりません。
独自のコードをいくつか表示してください。また、私はここに特定の質問が表示されません。 –
私はそれをstrtokしようと言ったように。あまり成功することはありません。 – Nahum
なぜ「文字列がフォーマットであるかを認識する必要がある」というのは本当の質問ではないのですか? 「文字列がフォーマットに適合するかどうかをどのように認識できますか?」という言い回しができます。 私の質問に何が間違っているのか本当に分かりませんか?なぜ人々は何の説明もせずにダウンボトム? 残念ながら、私は埋め込みマシンで作業し、スペースは非常に短いです。正規表現ライブラリは使用できません。 – Nahum