Mam tę funkcję
char toLowerCase(char buf[]){
for(int i =0; buf[i]; i++){
buf[i] = tolower(buf[i]);
}
return *buf;
}
co daje wynik
INPUT: HELoooO OOOOO
RESULT: heloooo ooooo
Jak zmodyfikować to, aby konwertuje tylko pierwszy ciąg na małe litery, tj. przestać po „”?
Próbowałem użyć strtok, ale po pierwszym ciągu zwraca błąd segmentacji.
Odpowiedzi:
2 dla odpowiedzi № 1Po prostu wyjdź z pętli po pierwszym spacji:
for (int i = 0; buf[i] && !isspace(buf[i]); ++i)
buf[i] = tolower(buf[i]);
isspace
jest zdefiniowany w ctype.h
tak jak tolower
.
Niektórzy twierdzą, że użycie wskaźników sprawi, że pętla będzie bardziej czytelna, ale jest to technicznie równoważne.
for (char * s = buf; *s && !isspace(*s); ++s)
*s = tolower(*s);
Jeśli chcesz pominąć wiodące miejsce, musisz nieco zmodyfikować warunek.
char * s = buf;
for (; *s && isspace(*s); ++s)
continue; /* skip leading space */
for (; *s && !isspace(*s); ++s)
*s = tolower(*s);
4 dla odpowiedzi nr 2
buf jest tablicą znaków. Nie możesz sprawdzić tylko 0 (to, co obecnie robisz), musisz również sprawdzić spacje. Aby to zrobić, możesz użyć operatora &&:
for(int i =0; buf[i] && buf[i] != " "; i++){
Następnie warunek jest wyzwalany, jeśli buf [i] jest a
0 dla odpowiedzi № 3
Wystarczy zmienić warunek, który utrzymuje działanie pętli for:
void toLowerCase(char buf[]){
for(int i =0; buf[i] && buf[i] != " "; i++){
buf[i] = tolower(buf[i]);
}
}
Usunąłem również wartość zwracaną, ponieważ zwracany jest pierwszy znak ciągu, który moim zdaniem nie jest tym, co zamierzałeś (*buf
jest taki sam jak buf[0]
).