2

シリアルポートからデータを受信するためにバッファを使用します。バッファの長さは100に固定されており、データを受信すると、このデータの長さを変数(インデックス)に格納します。

0からindex-1までのバッファに部分文字列が含まれているかどうかを確認したいと思います。

strstrとstrdupを使用してそれを実行できる可能性があることを読みましたが、これには2つの問題があります。まず、バッファから文字列を抽出する方法がわかりません。次に、1行後に文字列を削除するためだけに文字列をコピーする必要がなく、その中の部分文字列を探す方がよいでしょう。

私の変数は次のとおりです。

char output[100];
int index = 0;
char* substring;

そして、部分文字列がoutput [0:index]にある場合はtrueを返し、そうでない場合はfalseを返す関数が必要です。

どんな助けやリードも大歓迎です!

編集:私はatmel µCのコードを書いているので、それらの関数に制限されているようです。

編集2:実際には、標準のstring.hのすべての関数を使用できるようです。

編集3:依存関係を確認しました。その下には、呼び出すことができるすべての関数があります。

extern int ffs (int __val) __ATTR_CONST__;
extern int ffsl (long __val) __ATTR_CONST__;
extern int ffsll (long long __val) __ATTR_CONST__;
extern void *memccpy(void *, const void *, int, size_t);
extern void *memchr(const void *, int, size_t) __ATTR_PURE__;
extern int memcmp(const void *, const void *, size_t) __ATTR_PURE__;
extern void *memcpy(void *, const void *, size_t);
extern void *memmem(const void *, size_t, const void *, size_t) __ATTR_PURE__;
extern void *memmove(void *, const void *, size_t);
extern void *memrchr(const void *, int, size_t) __ATTR_PURE__;
extern void *memset(void *, int, size_t);
extern char *strcat(char *, const char *);
extern char *strchr(const char *, int) __ATTR_PURE__;
extern char *strchrnul(const char *, int) __ATTR_PURE__;
extern int strcmp(const char *, const char *) __ATTR_PURE__;
extern char *strcpy(char *, const char *);
extern int strcasecmp(const char *, const char *) __ATTR_PURE__;
extern char *strcasestr(const char *, const char *) __ATTR_PURE__;
extern size_t strcspn(const char *__s, const char *__reject) __ATTR_PURE__;
extern char *strdup(const char *s1);
extern size_t strlcat(char *, const char *, size_t);
extern size_t strlcpy(char *, const char *, size_t);
extern size_t strlen(const char *) __ATTR_PURE__;
extern char *strlwr(char *);
extern char *strncat(char *, const char *, size_t);
extern int strncmp(const char *, const char *, size_t) __ATTR_PURE__;
extern char *strncpy(char *, const char *, size_t);
extern int strncasecmp(const char *, const char *, size_t) __ATTR_PURE__;
extern size_t strnlen(const char *, size_t) __ATTR_PURE__;
extern char *strpbrk(const char *__s, const char *__accept) __ATTR_PURE__;
extern char *strrchr(const char *, int) __ATTR_PURE__;
extern char *strrev(char *);
extern char *strsep(char **, const char *);
extern size_t strspn(const char *__s, const char *__accept) __ATTR_PURE__;
extern char *strstr(const char *, const char *) __ATTR_PURE__;
extern char *strtok(char *, const char *);
extern char *strtok_r(char *, const char *, char **);
extern char *strupr(char *);
4

3 に答える 3

5

あなたが投稿したリンクから私は一緒に行きmemmem()ます。

void *memmem(const void *s1, 
             size_t len1, 
             const void *s2, 
             size_t len2);

この関数は、長さのメモリ領域で長さmemmem()の部分文字列の最初の出現の開始を検出します。s2len2s1len1

于 2012-12-12T21:02:00.977 に答える
0

マイケルが示唆しているように、あなたはおそらくを見る必要がありますstrnstr

ドキュメントからの抜粋:

 #include <string.h>

 char *
 strnstr(const char *s1, const char *s2, size_t n);

strnstr()関数は、文字列s1内でnullで終了する文字列s2の最初の出現箇所を特定します。ここで、n文字以下が検索されます。

だからあなたが欲しいものは

char* found = strnstr(output,substring,100);

C-libが制限されている場合、コードはかなり単純です。

char* strnstr(char* s, char* find, size_t slen)
{
    char c, sc;
    size_t len;

    if ((c = *find++) != '\0') {
        len = strlen(find);
        do {
            do {
                if ((sc = *s++) == '\0' || slen-- < 1)
                    return (NULL);
            } while (sc != c);
            if (len > slen)
                return (NULL);
        } while (strncmp(s, find, len) != 0);
        s--;
    }
    return ((char *)s);
}
于 2012-12-12T20:57:57.527 に答える
0

マイクロコントローラーlibにstrstrまたはstrnstrがない場合...

char* string_first_of(char* s, char* sub)
{
    int n;
    if(s == NULL) return NULL;
    if(sub == NULL) return s;
    n =  strlen(sub);
    while(*s != 0)
    {
        if(strncmp(s, sub, n) == 0)
        {
            return s;
        }
        s++;
    }
    return NULL;    
}

bool string_contains(char* s, char* sub)
{
    return string_first_of(s, sub) != NULL;
}
于 2012-12-12T21:00:16.917 に答える