Prównanie uint_t ze stringiem.

Odpowiedz Nowy wątek
2018-10-28 13:24

Rejestracja: 3 lata temu

Ostatnio: 1 rok temu

0

Jak poprawnie porównać uint8_t ze stringiem? Chciałem to zrobić za pomocą strcmp();.
Problem w tym że, nie działa tak jak powinno. Wykazuje, że są różne.

void StringCompare (uint8_t Buf){
  char *Data = (char*)Buf;
  char *string = "string";

  if(strcmp(Data,string)==0) {
      printf("Strings are equal");
   } else {
      printf("Strings are not equal");
   }
  }
edytowany 1x, ostatnio: furious programming, 2018-10-28 14:27

Pozostało 580 znaków

2018-10-28 14:04

Rejestracja: 6 lat temu

Ostatnio: 9 godzin temu

1

A co to znaczy dla Ciebie, że string jest równy uint8_t?

Nie rozumiem o co pytasz. - Raziel295 2018-10-28 14:11
@Raziel295: no, to są zupełnie inne typy. Wskaż mi jakiegoś uint8_t, który według Ciebie powinien być równy stringowi "string". - enedil 2018-10-28 14:26
Bo nie wiadomo kiedy wartości mają być równe, a kiedy różne. Podaj tablicę prawdy, koniecznie w nowym poście. - furious programming 2018-10-28 14:28
Ale ja go rzutuje na na typ tutaj char *Data = (char*)Buf; Następnie porównuje char* z char* w ifie. - Raziel295 2018-10-28 14:37
Prosiłem o doprecyzowanie w poście – czego nie zrozumiałeś? Poza tym używaj backticków do oznaczania fragmentów kodu, bo * w Twoim kodzie jest parsowany i używany do pochylania tekstu. - furious programming 2018-10-28 14:38

Pozostało 580 znaków

2018-10-28 14:46

Rejestracja: 3 lata temu

Ostatnio: 1 rok temu

0

Najpierw rzutuje char *Data = (char*)Buf; potem porównuję i jesli stringi są takie same wypisze "Strings are equal" a jeśli nie to "Strings are not equal"

Znów nie zrozumiałeś. Widzimy co robisz. Pytamy się co chcesz osiągnąć (bo sam piszesz, że nie jest oczekiwany efekt). - enedil 2018-10-28 15:06

Pozostało 580 znaków

2018-10-28 15:18

Rejestracja: 1 rok temu

Ostatnio: 1 rok temu

0

Może ten kod trochę wyjaśni sytuację:

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

#define STRING "string"

int StringCompare(uint8_t Buf){
    printf("Buf: %p\n",Buf);
    char *Data = (char *)Buf;
    char *string = STRING;
    return strcmp(Data,string);
}

int StringCompare2(uint8_t *Buf){
    printf("Buf: %p\n",Buf);
    char *Data = (char *)Buf;
    char *string = STRING;
    return strcmp(Data,string);
}

void print_equal_message(int equal){
    if(equal == 0){
        printf("String are equal");
    }else{
        printf("String are not equal");
    }
    printf("\n");
}

int main(){
    uint8_t to_check_bad[] = "some text";
    uint8_t to_check_good[] = STRING;

    printf("Test compare for StringCompare2\n");
    print_equal_message(StringCompare2(to_check_bad));
    print_equal_message(StringCompare2(to_check_good));

    printf("Test compare for StringCompare\n");
    print_equal_message(StringCompare(to_check_bad));
    print_equal_message(StringCompare(to_check_good));

    return 0;
}

Na poziomie kompilacji:

$ gcc -Wall -pedantic ./c_equal.c 
./c_equal.c: In function ‘StringCompare’:
./c_equal.c:9:16: warning: format ‘%p’ expects argument of type ‘void *’, but argument 2 has type ‘int’ [-Wformat=]
  printf("Buf: %p\n",Buf);
                ^
./c_equal.c:10:15: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast]
  char *Data = (char *)Buf;
               ^
./c_equal.c: In function ‘main’:
./c_equal.c:40:36: warning: passing argument 1 of ‘StringCompare’ makes integer from pointer without a cast [-Wint-conversion]
  print_equal_message(StringCompare(to_check_bad));
                                    ^~~~~~~~~~~~
./c_equal.c:8:5: note: expected ‘uint8_t {aka unsigned char}’ but argument is of type ‘uint8_t * {aka unsigned char *}’
 int StringCompare(uint8_t Buf){
     ^~~~~~~~~~~~~
./c_equal.c:41:36: warning: passing argument 1 of ‘StringCompare’ makes integer from pointer without a cast [-Wint-conversion]
  print_equal_message(StringCompare(to_check_good));
                                    ^~~~~~~~~~~~~
./c_equal.c:8:5: note: expected ‘uint8_t {aka unsigned char}’ but argument is of type ‘uint8_t * {aka unsigned char *}’
 int StringCompare(uint8_t Buf){
     ^~~~~~~~~~~~~

po uruchomieniu:

$ ./a.out 
Test compare for StringCompare2
Buf: 0xbfd9e176
String are not equal
Buf: 0xbfd9e16f
String are equal
Test compare for StringCompare
Buf: 0x76
Naruszenie ochrony pamięci
Pokaż pozostałe 2 komentarze
@MarekR22: Niestety nie mogę edytować tego posta, prawdopodobnie dlatego, że był napisany kolejny w tym wątku. - dobry duch 2018-10-29 15:01
@MarekR22: Gdybym mógł to bym zedytował. Niestety nie mogę. Czy Twój post jest ostatni w tamtym wątku, który pisałeś (wysłany obrazek)? (Poprzedni który - usunąłem z tego wątku miał możliwości edycyjne). Czyli krótko, czy możesz edytować przedostatni post w danym wątku? Jeśli tak to niestety to zależy od mojego konta, w innym wypadku, należałoby zmienić w kodzie strony odpowiednie miejsce, aby po usunięciu można było edytować ostatni post w wątku dla użytkownika (dodać odpowiednią funkcję - może że polityka forum jest inna). - dobry duch 2018-10-29 15:18
Jak widać na obrazku nie jest ostatni i jest stary. Mogę edytować rzeczy nawet z przed paru lat, które siedzą głęboko w historii wątku. @Adam Boduch: Może są jakieś ograniczenia dla nowych członków (nic mi o tym nie wiadomo), bo parę razy trafili się wandale, którzy usuwali treść przez edycję zawartość postów. - MarekR22 2018-10-29 16:33
@MarekR22: tak, są ograniczenia dla nowych członków. Starzy wyjadacze za to mogą edytować dowoli :) - Adam Boduch 2018-10-30 15:37

Pozostało 580 znaków

2018-10-28 16:39

Rejestracja: 6 lat temu

Ostatnio: 9 godzin temu

0

Sam zapis

    uint8_t to_check_bad[] = "some text";

jest niepoprawny (tzn dokonujesz niejawnej konwersji z char na uint8_t).

Natomiast wciąż nie rozumiem co chcesz osiągnąć castowaniem liczby (jakiegoś uint8_t) na wskaźnik na chara, prawie na pewno pod adresem o numerach od 0 do 255 nie ma niczego co możesz czytać.

To co chciałem osiągnąć to sprawdzić czy komenda która jest przesyłana jest poprawna. I jest ona wysyłana w postaci uint8_t. Tak więc musiałem ją castować na char* Może ja też nie do końca jasno się wyraziłem - Raziel295 2018-10-29 16:25
No chyba nie na char*, a na char. - enedil 2018-10-29 17:01

Pozostało 580 znaków

Odpowiedz

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0