Prównanie uint_t ze stringiem.

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");
   }
  }
1

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

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"

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
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ć.

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