

C言語で、main関数を書いています。  
送られてきた情報を区切るところまで出来ているのですが、その最初の文字が7Eで始まっているかをifで書きたいです。ただ、うまくいかず教えていただきたいです。

unsigned char buffの先頭が7Eになるはずなので、  
if(strcmp(buff,"7E",2)==0){  
かと思ったのですが、unsigned
charではstrcmp使えないし、分からなくなってしまいました。C言語は最近勉強しだしたので、わからないことだらけです。  
すみませんが、宜しくお願い致します。

[code]

     static void tty-read(void)
        {
         int i =0;
    　　unsigned char buff[1024];
        size-t len;
        TTYnitBlock(0x7E, 1,2,0,0,1);
        for(;;)
        len=TTYReadFrame(ttyfd, buff, 1024);
        if(len<0){
          fprintf(stderr, "TTYReadFrame %zd %d\n", len, errno);
          exit(1);
        }
         printf("Frame:%d len=%zd|n", i++, len);
         dump-packet(buff, len);
        }
        }
    
[/code]


CC BY-SA 3.0
2017-10-19T11:23:49.613
38868
2019-07-06T18:06:09.923
23086
question
c
C言語で、unsigned charの文字列を比較したいのです


先頭の値が0x7Eであることを調べるなら以下のようになります。

[code]

        if(buff[0] == 0x7E){
    
[/code]

文字通り"7E"をチェックするのであれば、キャストしてstrcmpで構いません。

[code]

        if(strncmp((char const *)buff,"7E",2)==0){
    
[/code]


CC BY-SA 3.0
2017-10-19T12:18:08.953
38870
2017-10-19T12:25:42.447
2017-10-19T12:25:42.447
5044
3337
38868
answer


`memcmp`を使うか、より安全な自作関数`contains`を使うことをおすすめします。

[code]

    #include <stdio.h>
    #include <stdbool.h>
    #include <stdint.h>
    #include <string.h>
    #include <assert.h>
    
    /**
     * bytesの先頭にtargetが含まれていたらtrue, 含まれていなければfalseを返す
     */
    static bool
    contains(const unsigned char *bytes,
             uint32_t bytes_size,
             const unsigned char *target,
             uint32_t target_size) {
        uint32_t i;
        for (i = 0; i < bytes_size && i < target_size; ++i) {
            if (bytes[i] != target[i]) {
                break;
            }
        }
    
        return i == target_size;
    }
    
    /**
     * テスト
     */
    void
    test(void) {
        assert(contains("7E****", 6, "7E", 2));
        assert(!contains("7F****", 6, "7E", 2));
        assert(!contains("7F", 2, "7EE", 3));
        assert(contains("777", 3, "777", 3));
        assert(!contains("777", 3, "333", 3));
    }
    
    int
    main(void) {
        unsigned char buf[1024] = "7E****";
    
        // 一番簡単な方法
        if (buf[0] == '7' && buf[1] == 'E') {
            puts("easy");
        }
    
        // memcmpを使った方法
        if (memcmp(buf, "7E", 2) == 0) {
            puts("memcmp");
        }
    
        // containsを使った方法
        if (contains(buf, sizeof buf, "7E", 2)) {
            puts("contains");
        }
    
        test();
    
        return 0;
    }
    
    
[/code]


CC BY-SA 4.0
2019-07-06T17:56:02.973
56460
2019-07-06T18:06:09.923
2019-07-06T18:06:09.923
25852
25852
38868
answer