OpenCV (Open Source Computer Vision, Wikipedie), tj. open source multiplatformní knihovna pro zpracování obrazu a počítačové vidění, byla vydána v nové major verzi 5.
Byla vydána nová verze 9.7 multiplatformní digitální pracovní stanice pro práci s audiem (DAW) Ardour. Přehled novinek, vylepšení a oprav v poznámkách k vydání.
Vývojáři webového prohlížeče Ladybird dnes oznámili, že mění způsob vývoje. S blížícím se vydáním alfa verze přestávají přijímat veřejné pull requesty. Všechny otevřené veřejné pull requesty budou uzavřeny. Tým nedokáže garantovat bezpečnost AI generovaných pull requestů.
OpenLogi (GitHub) je open source náhrada aplikace Logi Options+ pro přizpůsobení myší od společnosti Logitech. Zatím běží pouze na macOS.
Na čem pracují vývojáři webového prohlížeče Ladybird (GitHub)? Byl publikován přehled vývoje za květen (YouTube).
Úřad pro ochranu osobních údajů řeší desítky stížností na jednotné měsíční hlášení zaměstnavatele, které stát spustil počátkem dubna. Systém, jenž má firmám odlehčit od desítek formulářů, nejenže výrazně zatížil jejich účetní oddělení, ale docházelo v něm i k únikům osobních dat zaměstnanců k firmám, kde nepracovali. Podle ministerstva práce a sociálních věcí stála za problémem technická chyba. „Incident se týkal několika stovek
… více »Byla vydána (𝕏, Bluesky) nová verze 22.0.0 open source webového aplikačního frameworku Angular (Wikipedie). Přehled novinek v příspěvku na blogu.
Vim Classic byl vydán ve verzi 8.3. Drew DeVault oznámil tento fork editoru Vim (verze 8.2.0148, tj. těsně před zavedením Vim9 skriptování) v březnu letošního roku. Důvodem forku bylo, že vývojáři editorů Vim a Neovim začali při vývoji využívat LLM.
Open source konference DevConf.CZ 2026 proběhne 18. a 19. června v Brně na FIT VUT. Publikován byl program a spuštěna byla registrace.
Společnost JetBrains uvolnila verzi 2 svého open-source velkého jazykového modelu (LLM) pro vývojáře Mellum.
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);
. Ale to nechme laskavému čtenáři k vyřešení.
.
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;
}
/ přenositelnosti.
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).
Tak jednoduchý dotaz a 40 odpovědí, z nichž většina se zaobírá opravováním zapeklitých chyb zaslaných řešení.
(Za prvé: brát s rezervou a s humorem. Za druhé: mám Céčko rád, takže nic proti němu. Za třetí: chybičky se samozřejmě občas vloudí, ale tohle už mi přišlo vážně legrační.)
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.)
.
Zkrátka tohle je nádherná ukázka toho, jak se dá v Céčku krásně žonglovat se všelijakýma fintičkama, ale i zkušený člověk si při tom prostě může nabít držku. Vzpomínám si, jak jsem v prváku na konci semestru psal v Céčku domácí úkol—asi na 200-300 řádků "alignátor" textu (doprava, doleva, na střed a do zarovnaného bloku na zadanou šířku řádky, se zalamováním a já už nevím čím). Nabíjel jsem si hubu na stejných věcech jako diskutující tady a odnesl jsem si z toho jednu z nejcennějších zkušeností ve svém dosavadním informatickém výcviku.
Určitě bys ji udělal, maximálně bys ji tak mnohem déle hledal, protože "víc očí víc vidí". :-P (vtip... nebo ne?
)
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;
}
. Nakonec jsem za to dostal plný počet bodů ale tim kódem bych se nikde nechlubil.
Na svou obranu musím říct, že ta chyba s ukončovacím bytem byla fakt rafinovaným a zapeklitým způsobem schovaná.
Tiskni
Sdílej: