Czy masz do czynienia tylko z ASCII tylko z literami az?
Mark Byers
1
ascii. jak mam to wziąć pod uwagę? czy poniższy przykład nadal będzie działał? co się stanie, jeśli mój znak to „#” i zostanie wywołana funkcja tolower ()?
Tony Stark
1
To zadziała. Bardziej zastanawiałem się, czy twój ciąg zawiera rzeczy takie jak é lub Ü.
Mark Byers
1
Dlaczego po prostu nie użyć „strlwr”? strlwr((char*)str);Po prostu przechodzi przez ciąg i sam go przekształca.
Larry
1
@Larry To niestandardowe.
połowa
Odpowiedzi:
153
Znajduje się w bibliotece standardowej i jest to najprostszy sposób, w jaki widzę, aby zaimplementować taką funkcję. Więc tak, po prostu przejrzyj ciąg i zamień każdy znak na małe litery.
Coś tak trywialnego:
#include<ctype.h>for(int i =0; str[i]; i++){
str[i]= tolower(str[i]);}
lub jeśli wolisz jedną wkładkę, możesz użyć tej od JF Sebastian:
Aby uczynić go nieco bardziej czytelnym, możesz to zrobićfor(char *p = pstr;*p;++p) *p=*p>='A'&&*p<='Z'?*p|0x60:*p;
Grant Peters
7
Ta wersja jest w rzeczywistości wolniejsza niż glibc tolower(). 55,2 w porównaniu z 44,15 na moim komputerze.
jfs
nie wyobrażam sobie, że: tolower () zajmuje się znakami; tylko jeśli to makro
Oleg Razgulyaev
1
@oraz: tolower () ma int (*)(int)podpis. Oto kod używany do pomiarów wydajności gist.github.com/370497
jfs
@JF: widzę, że używali tabeli, ale mogę zoptymalizować: for (; * p; ++ p) if (* p> 'Z') {kontynuuj;} else if (* p <'A') {kontynuuj;} else {* p = * p | 0x60;}
Oleg Razgulyaev
1
Czy masz do czynienia tylko z ciągami znaków ASCII i nie masz problemów z lokalizacją? Więc tak, to byłby dobry sposób na zrobienie tego.
co się stanie, jeśli funkcja tolower () zostanie wywołana na znaku niebędącym ascii az? lubić '!' lub „#”. przetestowałem to na '#' i wydawało się, że działa dobrze. czy jest to generalnie prawdziwe dla wszystkich znaków ascii, które nie są literami az?
Tony Stark
1
@hatorade: tolower()pozostawia argument niezmieniony, jeśli nie znajduje się w zakresie „A” .. „Z”.
jfs
1
! i # są znakami ascii. Mark odnosił się do innych kodowań, takich jak UTF8, w których nie można założyć, że na znak przypada jeden bajt (tak jak to rozwiązanie)
hdgarrood
1
Jeśli potrzebujesz obsługi Unicode w funkcji małych liter, zobacz to pytanie:
Light C Unicode Library
Tak, spowoduje to złożenie / wrzeciona / okaleczenie różnych symboli (w ASCII każdy symbol, znak kontrolny lub cyfra z wyczyszczonym bitem 5 stanie się tym samym kodem znaku z ustawionym bitem 5 itp.), Więc naprawdę, poważnie, nie rób tego Użyj tego.
strlwr((char*)str);
Po prostu przechodzi przez ciąg i sam go przekształca.Odpowiedzi:
Znajduje się w bibliotece standardowej i jest to najprostszy sposób, w jaki widzę, aby zaimplementować taką funkcję. Więc tak, po prostu przejrzyj ciąg i zamień każdy znak na małe litery.
Coś tak trywialnego:
lub jeśli wolisz jedną wkładkę, możesz użyć tej od JF Sebastian:
źródło
for ( ; *p; ++p) *p = tolower(*p);
wydaje się bardziej idiomatyczny.char *
, ale nie, jeśli str jest tablicą char. Masz na to jakieś wyjaśnienie?konwersja na małe litery jest równoważna podniesieniu bitu 0x60, jeśli ograniczysz się do ASCII:
źródło
for(char *p = pstr;*p;++p) *p=*p>='A'&&*p<='Z'?*p|0x60:*p;
tolower()
. 55,2 w porównaniu z 44,15 na moim komputerze.int (*)(int)
podpis. Oto kod używany do pomiarów wydajności gist.github.com/370497Czy masz do czynienia tylko z ciągami znaków ASCII i nie masz problemów z lokalizacją? Więc tak, to byłby dobry sposób na zrobienie tego.
źródło
tolower()
pozostawia argument niezmieniony, jeśli nie znajduje się w zakresie „A” .. „Z”.Jeśli potrzebujesz obsługi Unicode w funkcji małych liter, zobacz to pytanie: Light C Unicode Library
źródło
Jeśli mamy być tak niechlujni, jak używać
tolower()
, zrób to:Ale cóż, trochę eksploduje, jeśli nakarmisz go jakimiś symbolami / cyframi i ogólnie jest to zło. Dobre pytanie do wywiadu.
źródło
Zapętlenie wskaźnika w celu uzyskania lepszej wydajności:
źródło