1

簡単に言えば、CI では、以下のようなデータでいっぱいのバッファがあります。

char buffer[255]="CODE=12345-MODE-12453-CODE1-12355"

私の質問は、これを検索する方法です。たとえば、セクションの場合、数字が変わることに注意してください。そのため、ワイルドカードまたは事前に設定された量のスペースを使用してCODE=12345、このように検索したいと思います。CODE=*****CODE=

このメソッドは、試行するために残された最後のものをコンパイルしません

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

int main ()
{
    char buf[255]="CODE=12345-MODE-12453-CODE1-12355";

#define TRIMSPACES(p) while(*p != '\0' && isspace((unsigned char)*p) != 0) ++p 
#define NSTRIP(p, n) p += n 
#define STRIP(p) ++p 

char* getcode(const char *input) 
{ 
  char *p = (char*) input, *buf, *pbuf; 

  if((buf = malloc(256)) == NULL) 
    return NULL; 

  pbuf = buf; 
  while(*p != '\0') { 
    if(strncmp(p, "CODE", 3) == 0) { 
      NSTRIP(p, 4); //remove 'code' 
      TRIMSPACES(p);//trim white-space after 'code' 

     if(*p != '=')  
       return NULL; 

      STRIP(p); // remove '=' 
      TRIMSPACES(p); //trim white-spaces after '=' 

/* copy the value until found a '-'  
   note: you must be control the size of it,  
   for avoid overflow. we allocated size, that's 256 
   or do subsequent calls to realloc() 
*/ 
      while(*p != '\0' && *p != '-') 
    *pbuf ++ = *p++; 

    //  break; 
    } 
    p ++; 
  } 

//put 0-terminator. 
  *pbuf ++ = '\0'; 

  return buf; 
} 




//   
}
4

4 に答える 4

3

sscanf()関数を使用できます。

int number;
sscanf(buffer, "CODE = %i", &number);

それがうまく機能するためには、バッファをnullで終了する必要があります。

于 2012-07-19T23:49:01.827 に答える
1

CODE=パートが常に文字列の先頭にあると仮定すると、それは非常に簡単です。

sscanf(buffer, "CODE = %d", &number);

...しかし、あなたはなりたいbufferのであってchar[255]、ではありませんunsigned long

編集:CODE=パーツが必ずしも文字列の先頭にあるとは限らない場合は、を使用strstrしてバッファ内を検索CODEし、そのポイントからsscanfを実行して、その直後を確認できます。

int codes[256];
char *pos = buffer;
size_t current = 0;

while ((pos=strstr(pos, "CODE")) != NULL) {
     if (sscanf(pos, "CODE = %d", codes+current))
         ++current;
     pos += 4;
}

Edit2:たとえば、次のように使用します。

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

int main ()
{
    // This is full of other junk as well 
    char buffer[255]="CODE=12345 MODE-12453 CODE=12355" ; 
    int i;
    int codes[256]; 
    char *pos = buffer; 
    size_t current = 0; 

    while ((pos=strstr(pos, "CODE")) != NULL) { 
        if (sscanf(pos, "CODE = %d", codes+current)) 
            ++current; 
        pos += 4; 
    } 

    for (i=0; i<current; i++)
        printf("%d\n", codes[i]);

    return 0;
}

私の場合、これにより次の出力が生成されます。

12345
12355

...2つの「CODE=xxx」セクションを正しく読み取りますが、「MODE=yyy」セクションをスキップします。

于 2012-07-19T23:49:08.897 に答える
1

代わりにそれを行う別の方法sscanf()

 char *input, *code;

  input = strstr(buf, "CODE");
  if(input == NULL) {
    printf("Not found CODE=\n");
    return -1;
  }

  code = strtok(strdup(input), "=");
  if(code != NULL) {
    code = strtok(NULL, "-");
    printf("%s\n", code); // code = atoi(code);
  } else {
    //not found '='
  }

または、より堅牢な方法..もう少し複雑:

    #define TRIMSPACES(p) while(*p != '\0' && isspace((unsigned char)*p) != 0) ++p
    #define NSTRIP(p, n) p += n
    #define STRIP(p) ++p

    char* getcode(const char *input, size_t limit)
{
    char *p = (char*) input, *buf, *pbuf;
    size_t i = 0;

    while(*p != '\0') {
        if(strncmp(p, "CODE", 3) == 0) {

        NSTRIP(p, 4); //remove 'code'
        TRIMSPACES(p);//trim all white-spaces after 'code'

        /* check we have a '=' after CODE (without spaces).
           if there is not, returns NULL
        */
        if(*p != '=') 
            return NULL;

        /* ok. We have.. now we don't need of it
            just remove it from we output string.
        */
        STRIP(p);

        /* remove again all white-spaces after '=' */
        TRIMSPACES(p);

        /* the rest of string is not valid,
            because are white-spaces values.
        */
        if(*p == '\0')
            return NULL;

        /* allocate space for store the value
            between code= and -.
            this limit is set into second parameter.
        */
        if((buf = malloc(limit)) == NULL)
            return NULL;

    /* copy the value until found a '-' 
        note: you must be control the size of it, 
       for don't overflow. we allocated 256 bytes.
        if the string is greater it, do implementation with
        subjecents call to realloc()
    */
     pbuf = buf;
      while(*p != '\0' && *p != '-' && i < limit) {
        *pbuf ++ = *p++; 
        i ++;
    }

      *pbuf ++ = '\0';
      return buf;
    }
    p ++;
  }

  return NULL;
}

その後:

char buf[255] = "foo baa CODE =     12345-MODE-12453-CODE-12355";
char *code = getcode(buf,256);

if(code != NULL) {
    printf("code = %s\n", code);
    free(code);
} else {
    printf("Not found code.\n");
}

出力:

コード = 12345

これをチェックしてくださいonline

大文字と小文字を区別したくない場合は、strncasecmp()that's POSIX 関数を使用できます。

于 2012-07-20T00:34:55.530 に答える
0
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char *getcode(const char *str, const char *pattern){
    //pattern: char is match, space is skip, * is collect
    static const char *p=NULL;
    char *retbuf, *pat;
    int i, match, skip, patlen;
    if(str != NULL) p=str;
    if(p==NULL || *p=='\0') return NULL;
    if(NULL==(retbuf=(char*)malloc((strlen(p)+1)*sizeof(char))))
        return NULL;
    pat = (char*)pattern;
    patlen = strlen(pat);
    i = match = skip = 0;
    while(*p){
        if(isspace(*p)){
            ++p;
            ++skip;
            continue;
        }
        if(*pat){
            if(*p == *pat){
                ++match;
                ++p;
                ++pat;
            } else if(*pat == '*'){
                ++match;
                retbuf[i++]=*p++;
                ++pat;
            } else {
                if(match){//reset
                    pat=(char*)pattern;
                    p -= match + skip -1;
                    i = match = skip = 0;
                } else //next
                    ++p;
            }
        } else {
            break;
        }
    }
    if(i){//has match
        retbuf[i++]='\0';
        retbuf=realloc(retbuf, i);
        return retbuf;
    } else {
        free(retbuf);
        return NULL;
    }
}

int main (){
    char *code;
    code=getcode("CODE=12345-MODE-12453-CODE1-12355", "CODE=*****");
    printf("\"%s\"\n",code);//"12345"
    free(code);
    code=getcode(" CODE = 12345-MODE-12453-CODE1-12355", "CODE=*****");
    printf("\"%s\"\n",code);//"12345"
    free(code);
    code=getcode("CODE-12345-MODE-12453-CODE1-12355", "CODE=*****");
    if(code==NULL)printf("not match\n");//not match
    code=getcode("CODE=12345-MODE-12453-CODE=12355", "CODE=*****");
    printf("\"%s\"\n",code);//"12345"
    free(code);
    code=getcode(NULL, "CODE=*****");
    printf("\"%s\"\n",code);//"12355"
    free(code);
    code=getcode("CODE=12345-MODE-12453-CODE1-12355", "CODE=*****");
    printf("\"%s\"\n",code);//"12345"
    free(code);
    code=getcode(NULL, "CODE1-*****");
    printf("\"%s\"\n",code);//"12355"
    free(code);
    return 0;
}
于 2012-07-20T05:58:07.773 に答える