Jak określić długość niepodpisanego znaku *?Jak określić długość niepodpisanego znaku *?
Odpowiedz
Dla rzeczywistej wielkości wskaźnika:
size_t s = sizeof(unsigned char*);
Jeśli chcesz długość łańcucha:
unsigned char* bla = (unsigned char*)"blabla";
int s = strlen((char*)bla);
"blabla" daje łańcuch tylko do odczytu, więc bla powinien być stałym znakiem bez znaku *. –
To nie powinno się kompilować. "blabla" to const char * i nie można przypisać znaku const * do znaku bez znaku * bez rzutowania. –
To nie jest zadanie - to inicjalizacja - robione przez cały czas. –
Przez unsigned char * Pewnie myśli ciąg znajdujący się na tym wskaźniku. W takim przypadku byłby to:
strlen(your_string_pointer)
Jednak tylko znajdzie się pozycja \ 0. Nie ma gwarancji, że jest to faktycznie przydzielony rozmiar bloku pamięci.
http: //www.cplusplus.com/reference/clibrary/cstring/strlen ... strlen pobiera "const char *", a nie bez znaku. – xtofl
Może to mieć dwa znaczenia. Czy chcesz wiedzieć, jak duży jest typ wskaźnika? Jeśli tak, to odpowiedź jest poprawna Joce
size_t size = sizeof(unsigned char*);
Jeśli chce wiedzieć ile elementów ma wskaźnik do punktu, który jest nieco bardziej skomplikowana. Jeśli jest to ciąg w stylu C, to najlepszym rozwiązaniem jest strlen lub jakaś odmiana.
Jednak jeśli jest to tylko wskaźnik do znaku unsigned char, który nie ma związku z łańcuchem w stylu C, to nie ma sposobu, aby niezawodnie osiągnąć to, czego szukasz. C/C++ nie kojarzy pola długości ze wskaźnikiem. Będziesz musiał podać długość za pomocą wskaźnika lub użyć wektora podobnego do klasy, który przechowuje zarówno wskaźnik, jak i długość.
Masz rację, że nie możesz odzyskać przydzielonej długości - w oczach wielu ludzi jest to decyzja dotycząca złych wzorców językowych. Mylisz się, jeśli masz dwa znaczenia: być może musisz znać długość zawartego łańcucha zakończonego zerem, choć lepiej byłoby użyć podpisanego znaku. Zróbcie dwa i pół :) – xtofl
Czy chcesz długość wskaźnika, który byłby int. Jeśli chcesz długość łańcucha, który jest wskazywany, użyj strlen: np. Rozmiar wskaźnika: sizeof (unsigned char *) Rozmiar łańcucha: strlen (unsigned char *) znaki wielobajtowe dostanie zgłaszane jako ..multi bajt
Jeśli używasz C++, a jego ciąg w unsigned char *, lepiej jest najpierw umieścić go w std :: string przed manipulowaniem nim. W ten sposób możesz robić różne rzeczy i nadal być w stanie uzyskać długość() i/lub pojemność(), kiedy tylko chcesz.
Zakładam, że robisz rzeczy na rzecz wspomnianej macierzy, aby jej wielkość nie była stała. Jeśli tylko alokujesz, ustawiasz i zapominasz, zawsze możesz zapisać rzeczywisty rozmiar alokacji tablicy w oddzielnej zmiennej - lub lepiej, utwórz strukturę/klasę.
//WARNING: memory issues not addressed here.
struct myStringStruct
{
unsigned char * string;
int len;
allocate(int size) {
len = size;
string = malloc(sizeof(unsigned char) * len);
}
}
Dosyć bardziej skomplikowany niż to, a Ty ponownie wynajdujesz std :: string.
W idealnym świecie nie. Używasz char * dla ciągów w stylu C (które są zakończone NUL i możesz zmierzyć długość), a unsigned char * tylko dla danych bajtowych (które pochodzą z jego długości w innym parametrze lub czymkolwiek, i które prawdopodobnie dostaniesz do pojemnik STL jak najszybciej, taki jak vector<unsigned char>
lub basic_string<unsigned char>
).
Problemem root jest to, że nie można tworzyć przenośnych założeń o tym, czy reprezentacje pamięci char i unsigned char są takie same. Zwykle są, ale wolno im nie być. Tak więc nie ma funkcji biblioteczkowych podobnych do łańcuchów, które działają na niepodpisanym char *, tylko na char *, a generalnie nie jest bezpiecznie rzucać unsigned char * do podpisanego znaku * i traktować wynik jako ciąg znaków. Ponieważ znak char może być podpisany, oznacza to, że nie ma rzucania niepodpisanego znaku * na znak *.
Jednak 0 jest zawsze tą samą wartością reprezentacji w znaku bez znaku i znaku. Więc w świecie nieidealnym, jeśli masz gdzieś ciąg znaków w stylu C, ale przybył jako niepodpisany znak *, to (a) rzucisz go na znak * i zaczniesz go używać, ale także (b) dowiedz się, kto ci to zrobił i poproś, aby przestali.
- 1. JSDoc - jak określić długość tablicy
- 2. Jak określić długość Fixnum w Ruby?
- 3. Jak określić długość ramki Ethernet II?
- 4. Podpisywanie niepodpisanego zestawu
- 5. Dlaczego lub dlaczego nie należy używać "UL", aby określić długość bez znaku?
- 6. Programowo określić liczbę uderzeń w chińskim znaku?
- 7. Jak uzyskać długość char **?
- 8. Jak określić długość pliku audio powiązanego z AVAudioPlayer
- 9. Jak określić minimalną długość słowa w pełnym wyszukiwaniu tekstowym PostgreSQL?
- 10. Jak określić długość (w pikselach) ciągu renderowanego na stronie internetowej?
- 11. Kiedy używać niepodpisanego wskaźnika znakowego
- 12. co to oznacza bitowe przesunięcie w lewo niepodpisanego znaku z 16
- 13. Jak uzyskać długość ciągu znaków
- 14. Generowanie niepodpisanego, wydania apk z Androidem Studio
- 15. Jak # zdefiniować ciąg znaków bez znaku *?
- 16. Jak znaleźć długość argv [] w C
- 17. Jak zdefiniować długość Sequelize.STRING?
- 18. Jak zwiększyć długość tablicy
- 19. Jak uzyskać długość napisu?
- 20. jak znaleźć długość zestawu?
- 21. Jak znaleźć długość LPCSTR
- 22. Jak określić maksymalną długość kolumny pola przy użyciu kodu struktury encji najpierw
- 23. Walidator Hibernacji - @ Długość - Jak określić oddzielną wiadomość dla min. I maks.?
- 24. Długość danych a długość CRC
- 25. Maksymalna długość wektora w R
- 26. Format printf dla niepodpisanego __int64 w systemie Windows
- 27. Pytanie dotyczące zachowania C dla niepodpisanego liczby całkowitej underflow
- 28. MATLAB: Odczytanie obu bajtów niepodpisanego 16-bitowego pliku binarnego
- 29. Długość ciągu w pikselach
- 30. Maks. Długość łańcucha Apache Długość osiągnęła
Większość odpowiedzi wskazuje na potrzebę podania przez ciebie wartości "długość": liczba elementów, wielkość zmiennej zawierającej wskaźnik, czy może odnosisz się do znaków (bez znaku?) Do zera zakończonego łańcuchem? – xtofl