zamiana stringa

GO
  • Rejestracja:około 6 lat
  • Ostatnio:około miesiąc
  • Postów:92
0

Witam
Piszę funkcję, która ma za zadanie przekształcić stringa w zależności od tego ile ma znaków dużych lub małych. Jeśli mniej jest małych lub liczba małych i dużych znaków jest równa stringa zmieniamy do małych znaków. Jeśli liczba dużych jest większa zmieniamy na stringa z dużych znaków. Program poniżej

Kopiuj
char *solve(const char *str)
{
  char *result=(char*)malloc(sizeof(char)*strlen(str)+1);
  memset(result,'\0',strlen(str)+1);
  int lower=0,upper=0;
  for(int i=0;i<strlen(str);i++)
   if(isupper(str[i]))
     upper+=1;
  else
    lower+=1;
  if(lower>=upper)
    for(int i=0;i<strlen(str);i++)
      result[i]=tolower(str[i]);
  else
    for(int i=0;i<strlen(str);i++)
      result[i]=toupper(str[i]);
  return result;
}

Mam pytanie odnośnie tego czy zamiany na duże lub małe litery można dokonać za pomocą strlwr lub strupr. Jeśli tak to jak bo nie mogę znaleźć dobrego opisu funkcji
próbowałem

Kopiuj
if(lower>=upper
return strlwr(str)
else
return strupr(str)

może ktoś pomóc

_13th_Dragon
  • Rejestracja:ponad 19 lat
  • Ostatnio:3 miesiące
3

Odradzam przydzielenia pamięci wewnątrz funkcji ponieważ nie zapanujesz nad zwolnieniem.

Kopiuj
char *solve(char *str)
{
	int toup=0;
	for(int i=0;i<strlen(str);++i) toup+=(isupper(str[i])!=0)-(islower(str[i])!=0); // zapomniałeś o cyfrach i znakach specjalnych
	return toup>=0?strupr(str):strlwr(str);
}

ale jeżeli koniecznie chcesz dać ciała:

Kopiuj
char *solve(const char *str)
{
	int toup=0;
	for(int i=0;i<strlen(str);++i) toup+=(isupper(str[i])!=0)-(islower(str[i])!=0); // zapomniałeś o cyfrach i znakach specjalnych
	return strdup(toup>=0?strupr(str):strlwr(str));
}

Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
AK
  • Rejestracja:ponad 6 lat
  • Ostatnio:około miesiąc
  • Postów:3561
2
gonskabalbinka napisał(a):

Mam pytanie odnośnie tego czy zamiany na duże lub małe litery można dokonać za pomocą strlwr lub strupr. Jeśli tak to jak bo nie mogę znaleźć dobrego opisu funkcji
próbowałem

Kopiuj
if(lower>=upper
return strlwr(str)
else
return strupr(str)

https://www.google.com/search?client=firefox-b-d&q=strlwr
Tylko nie tutki, są pisane przez blondynki dla blondynek, a referencje (u mnie pozycja 2 i następpne)

To, co jest BARDZO WAŻNE, to większość tego typu funkcji w C zmienia oryginał, a return tegoż adresu oryginału można powiedzieć jest efektem ubocznym.
Jeśli po powrocie z oryginałem jest coś nie-ten-tego, np przestał istnieć, to return jest bezużyteczny / błedny


Bo C to najlepszy język, każdy uczeń ci to powie
_13th_Dragon
Nie nazwałbym oryginałem to co się w trakcie zmieniło, wg mnie niezbyt trafnie sformułowałeś.
MarekR22
Moderator C/C++
  • Rejestracja:około 17 lat
  • Ostatnio:9 minut
1

Ja bym robił coś takiego:

Kopiuj
int stringCountIf(const char* s, int (*pred)(int))
{
    int count = 0;
    while (*s) count += (0 != pred(*s));
    return count;
}

int stringLowerCaseDomination(const char *s)
{
    return stringCountIf(s, islower) >= stringCountIf(s, isupper);
}

void stringToUpper(const char *s, char *dst)
{
    while (*s) *dst++ = toupper(*s++);
}

void stringToLower(const char *s, char *dst)
{
    while (*s) *dst++ = tolower(*s++);
}

void stringMakeUniformCase(const char *s, char *dst)
{
    if (stringLowerCaseDomination(s))
        stringToLower(s, dst);
    else
        stringToUpper(s, dst);
}

Zarządzanie pamięcią, jest wtedy przeniesione na użytkownika API

co do tego:

Mam pytanie odnośnie tego czy zamiany na duże lub małe litery można dokonać za pomocą strlwr lub strupr.

To nie jest część standardu, tylko wymysł MS, więc lepiej nie używać.


Jeśli chcesz pomocy, NIE pisz na priva, ale zadaj dobre pytanie na forum.
edytowany 2x, ostatnio: MarekR22
GO
No właśnie nie jest część standardu i dlatego serwer wyrzucał błędy.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.