Byla vydána nová verze 4.5 (𝕏, Bluesky, Mastodon) multiplatformního open source herního enginu Godot (Wikipedie, GitHub). Přehled novinek i s náhledy v příspěvku na blogu.
Byla vydána verze 3.0 (Mastodon) nástroje pro záznam a sdílení terminálových sezení asciinema (GitHub). S novou verzí formátu záznamu asciicast v3, podporou live streamingu a především kompletním přepisem z Pythonu do Rustu.
Canonical oznámil, že bude podporovat a distribuovat toolkit NVIDIA CUDA (Wikipedie) v Ubuntu.
Tržní hodnota americké společnosti Alphabet, která je majitelem internetového vyhledávače Google, dnes poprvé překonala hranici tří bilionů dolarů (62,1 bilionu Kč). Alphabet se připojil k malé skupině společností, které tuto hranici pokořily. Jsou mezi nimi zatím americké firmy Nvidia, Microsoft a Apple.
Spojené státy a Čína dosáhly dohody ohledně pokračování populární čínské platformy pro sdílení krátkých videí TikTok v USA. V příspěvku na síti Truth Social to dnes naznačil americký prezident Donald Trump. Dosažení rámcové dohody o TikToku vzápětí oznámil americký ministr financí Scott Bessent, který v Madridu jedná s čínskými představiteli o vzájemných obchodních vztazích mezi USA a Čínou. Bessentova slova později potvrdila také čínská strana.
MKVToolNix, tj. sada nástrojů pro práci s formátem (medialnym kontajnerom) Matroska, byl vydán ve verzi 95.0. Podpora přehrávání formátu Matroska míří do Firefoxu [Bug 1422891, Technický popis]. Přehrávání lze již testovat ve Firefoxu Nightly.
Spolek OpenAlt zve příznivce otevřených řešení a přístupu na 211. sraz, který proběhne v pátek 19. září od 18:00 ve Studentském klubu U Kachničky na Fakultě informačních technologií Vysokého učení technického na adrese Božetěchova 2/1. Na srazu proběhne přednáška Jiřího Eischmanna o nové verzi prostředí GNOME 49. Nemáte-li možnost se zúčastnit osobně, přednáškový blok bude opět streamován živě na server VHSky.cz a následně i zpřístupněn záznam.
Microsoft se vyhnul pokutě od Evropské komise za zneužívání svého dominantního postavení na trhu v souvislosti s aplikací Teams. S komisí se dohodl na závazcích, které slíbil splnit. Unijní exekutivě se nelíbilo, že firma svazuje svůj nástroj pro chatování a videohovory Teams se sadou kancelářských programů Office. Microsoft nyní slíbil jasné oddělení aplikace od kancelářských nástrojů, jako jsou Word, Excel a Outlook. Na Microsoft si
… více »Samba (Wikipedie), svobodná implementace SMB a Active Directory, byla vydána ve verzi 4.23.0. Počínaje verzí Samba 4.23 jsou unixová rozšíření SMB3 ve výchozím nastavení povolena. Přidána byla podpora SMB3 přes QUIC. Nová utilita smb_prometheus_endpoint exportuje metriky ve formátu Prometheus.
Správcovský tým repozitáře F-Droid pro Android sdílí doporučení, jak řešit žádosti o odstranění nelegálního obsahu. Základem je mít nastavené formální procesy, vyhrazenou e-mailovou adresu a být transparentní. Zdůrazňují také důležitost volby jurisdikce (F-Droid je v Nizozemsku).
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) vypsatStripSpaces(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é
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: