zamiana stringa

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

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

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

może ktoś pomóc

3

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

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:

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));
}
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

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

1

Ja bym robił coś takiego:

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ć.

1 użytkowników online, w tym zalogowanych: 0, gości: 1