/ / Konwertuj tylko pierwsze słowo łańcucha na małe litery - c

Konwertuj tylko pierwsze słowo łańcucha na małe litery - c

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 № 1

Po 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]).