Byl vydán Nextcloud Hub 8. Představení novinek tohoto open source cloudového řešení také na YouTube. Vypíchnout lze Nextcloud AI Assistant 2.0.
Vyšlo Pharo 12.0, programovací jazyk a vývojové prostředí s řadou pokročilých vlastností. Krom tradiční nadílky oprav přináší nový systém správy ladících bodů, nový způsob definice tříd, prostor pro objekty, které nemusí procházet GC a mnoho dalšího.
Microsoft zveřejnil na GitHubu zdrojové kódy MS-DOSu 4.0 pod licencí MIT. Ve stejném repozitáři se nacházejí i před lety zveřejněné zdrojové k kódy MS-DOSu 1.25 a 2.0.
Canonical vydal (email, blog, YouTube) Ubuntu 24.04 LTS Noble Numbat. Přehled novinek v poznámkách k vydání a také příspěvcích na blogu: novinky v desktopu a novinky v bezpečnosti. Vydány byly také oficiální deriváty Edubuntu, Kubuntu, Lubuntu, Ubuntu Budgie, Ubuntu Cinnamon, Ubuntu Kylin, Ubuntu MATE, Ubuntu Studio, Ubuntu Unity a Xubuntu. Jedná se o 10. LTS verzi.
Na YouTube je k dispozici videozáznam z včerejšího Czech Open Source Policy Forum 2024.
Fossil (Wikipedie) byl vydán ve verzi 2.24. Jedná se o distribuovaný systém správy verzí propojený se správou chyb, wiki stránek a blogů s integrovaným webovým rozhraním. Vše běží z jednoho jediného spustitelného souboru a uloženo je v SQLite databázi.
Byla vydána nová stabilní verze 6.7 webového prohlížeče Vivaldi (Wikipedie). Postavena je na Chromiu 124. Přehled novinek i s náhledy v příspěvku na blogu. Vypíchnout lze Spořič paměti (Memory Saver) automaticky hibernující karty, které nebyly nějakou dobu používány nebo vylepšené Odběry (Feed Reader).
OpenJS Foundation, oficiální projekt konsorcia Linux Foundation, oznámila vydání verze 22 otevřeného multiplatformního prostředí pro vývoj a běh síťových aplikací napsaných v JavaScriptu Node.js (Wikipedie). V říjnu se verze 22 stane novou aktivní LTS verzí. Podpora je plánována do dubna 2027.
Byla vydána verze 8.2 open source virtualizační platformy Proxmox VE (Proxmox Virtual Environment, Wikipedie) založené na Debianu. Přehled novinek v poznámkách k vydání a v informačním videu. Zdůrazněn je průvodce migrací hostů z VMware ESXi do Proxmoxu.
R (Wikipedie), programovací jazyk a prostředí určené pro statistickou analýzu dat a jejich grafické zobrazení, bylo vydáno ve verzi 4.4.0. Její kódové jméno je Puppy Cup.
dobrý den, potřeboval bych poradit algorytmus na nahrazení více mezer pouze jednou...tzn. kdyz na vstup zadam: ahoj jak se vede. tak aby to vypsalo ahoj jak se vede
man strtok
algorytmusZačíná to pěkně .
nahrazení více mezerCo třeba číst znak po znaku a pokud předchozí i současný znak jsou oba mezera, tak nevypsat nic a jinak vypsat ten současný?
#define DELKARETEZCE 20 void StripSpaces(char * retezec); int main() { char * retezec; retezec=(char *)malloc(DELKARETEZCE * sizeof(retezec); scanf(%s,retezec); StripSpaces(retezec); return 0; } void StripSpaces(char * retezec) { char * buffer; char PredchoziZnak = 'a'; int i = 0; buffer = (char *)malloc(DELKARETEZCE * sizeof(buffer); for(i = 0; i < DELKARETEZCE; i++) { if(PredchoziZnak != ' ') buffer[0] = retezec[0]; PredchoziZnak = retezec[0]; } }Nic jednodussiho me nenapadlo...
#define DELKARETEZCE 20 void StripSpaces(char * retezec); int main() { char * retezec; retezec=(char *)malloc(DELKARETEZCE * sizeof(retezec); scanf(%s,retezec); StripSpaces(retezec); free(retezec); return 0; } void StripSpaces(char * retezec) { char * buffer; char PredchoziZnak = 'a'; int i = 0; buffer = (char *)malloc(DELKARETEZCE * sizeof(buffer); for(i = 0; i < DELKARETEZCE; i++) { if(PredchoziZnak != ' ' && buffer[i] != ' ') buffer[i] = retezec[i]; PredchoziZnak = retezec[i]; } strcpy(retezec,buffer); free(buffer); }
A taky by nebylo na škodu tu krásu (myslim, ten řetězec bez násobných mezer) vypsat . Ale to nechme laskavému čtenáři k vyřešení.StripSpaces(retezec); free(retezec);
Tohle by nefungovalo... Je potreba mit druhej citac na ten cilovej buffer.
#define DELKARETEZCE 20 void StripSpaces(char * retezec); int main() { char * retezec; retezec=(char *)malloc(DELKARETEZCE * sizeof(retezec); scanf(%s,retezec); StripSpaces(retezec); free(retezec); return 0; } void StripSpaces(char * retezec) { char * buffer; char PredchoziZnak = 'a'; int i = 0; int j = 0; buffer = (char *)malloc(DELKARETEZCE * sizeof(buffer); for(i = 0; i < DELKARETEZCE; i++) { if(PredchoziZnak != ' ' && buffer[i] != ' ') buffer[j++] = retezec[i]; PredchoziZnak = retezec[i]; } strcpy(retezec,buffer); free(buffer); }
#include <stdio.h> #include <string.h> char *strip_spaces(char *s) { int i, pos = 0; for (i = 0; i < strlen(s); i++) { s[pos] = s[i]; if (s[i] != ' ' | (s[i] == ' ' && (i < 1 || s[i-1] != ' '))) pos++; } s[pos] = 0; return s; } int main(void) { char *s = strdup(" toto je retazec "); printf("'%s'\n", strip_spaces(s)); }
sprintf() tiez meni argument a svet sa nezrutil.Funkce sprintf má jasně dáno, že do toho argumentu bude zapisovat, Váš příklad je zavádějící k
printf("`%s' -> `%s'\n", s, strip_spaces(s))
, ale ouha.
Akurat je vhodne napisat do komentara, ze to modifikuje s (keby si to niekto nahodou v tych 8 riadkoch nevsimol).To je určitě vhodné, ba přímo nutné. A taky je jedna věta v lidském jazyce kratší a srozumitelnější, než 8 řádek v C, které nemusí být navíc vždy k dispozici.
$ for i in `seq 1 10`; do time ./a.out; done real 0m2.720s user 0m2.572s sys 0m0.024s real 0m2.678s user 0m2.600s sys 0m0.000s real 0m2.692s user 0m2.612s sys 0m0.008s real 0m2.691s user 0m2.604s sys 0m0.008s real 0m2.675s user 0m2.600s sys 0m0.016s real 0m2.697s user 0m2.608s sys 0m0.004s real 0m2.685s user 0m2.600s sys 0m0.012s real 0m2.692s user 0m2.596s sys 0m0.004s real 0m2.690s user 0m2.596s sys 0m0.008s real 0m2.688s user 0m2.600s sys 0m0.000s
void vyhozeni_mezer (const char* input, char* output)
{
int output_size = 0;
for (int i = 0; i < strlen (input); i++)
{
if (input[i] != ' ')
{
output[output_size] = input[i];
output_size++;
}
else if ((output_size == 0) ||
(output[output_size] != ' '))
{
output[output_size] = input[i];
output_size++;
}
}
output[output_size] = 0;
return;
}
char *strdup_no_dup_space(const char *src) { char *dest = (char *) malloc(strlen(src)); char *p_src = src, *p_dest = dest; if (dest && (*p_dest = *p_src++)) { while ((*p_dest == ' ' && *p_src == ' ') || (*(++p_dest) = *p_src)) p_src++; } return dest; }
A co null terminator?
Nebudu napínat, pro chudinku nulu nemusí být místo :)
char *strdup_no_dup_space(const char *src) { if (src == NULL) return NULL; char *dest = (char *) malloc(strlen(src) + 1); char *p_src = src; const char *p_dest = dest; if (dest && (*p_dest = *p_src++)) { while ((*p_dest == ' ' && *p_src == ' ') || (*(++p_dest) = *p_src)) p_src++; } return dest; }Teď už by to mělo být dokonalé
char *strdup_no_dup_space(const char *src) { if (src == NULL) return NULL; char *dest = (char *) malloc(strlen(src) + 1); const char *p_src = src; char *p_dest = dest; if (dest && (*p_dest = *p_src++)) { while ((*p_dest == ' ' && *p_src == ' ') || (*(++p_dest) = *p_src)) p_src++; } return dest; }
Někoho by mohlo zaskočit třeba toto:
int isEqual1 = (int)('\377' == 255); int isEqual2 = ((int)'\377' == 255); int isEqual3 = ((unsigned int)'\377' == (unsigned int)255); int isEqual4 = ((unsigned int)((unsigned char)'\377') == (unsigned int)255); printf("isEqual1==%d\n", isEqual1); printf("isEqual2==%d\n", isEqual2); printf("isEqual3==%d\n", isEqual3); printf("isEqual4==%d\n", isEqual4);
Dobře to není, aneb programátorská hádanka číslo 4 :)
Už je to vyřešené. Operátory jsou právě v pohodě, takto se v C běžně píše, a připadá mi to i přehledné. Horší to bylo s alokací paměti. Občas se stane, že někdo zapomene připočítat NULL terminator (proto mám osobně radši nějakou knihovnu, která obsahuje String, a postará se o to).
Ten původní kód by mu ve Visual Studiu v debug režimu asi vyhodil error (mám pocit, že free() detekuje přepis hned za alokovaným prostorem), v linuxu by si stěžoval valgrind (popřípadě přímo glibc, pokud by měl string ideální velikost).
Jestli se zase někdy nachomýtnu v diskuzi o tom, jak je psaní v C, žonglování s pointery, ukončovacími nulami a dalšími lahůdkami čirý masochismusO tom není třeba diskutovat, to je zřejmé (A předpokládám, že též bylo zřejmé, že tuhle poznámku si neodpustím.)
Opravdu?
std::string str_no_dup_space(const std::string& str) { std::string ret; std::string::const_iterator it = str.begin(); bool space = false; for(; it != str.end(); ++it) { if( *it == ' ' ) { if( !space ) ret += ' '; space = true; } else { ret += *it; space = false; } } return ret; }
Tiskni Sdílej: