Projekt systemd schválil kontroverzní pull request, který do JSON záznamů uživatelů přidává nové pole 'birthDate', datum narození, tedy údaj vyžadovaný zákony o ověřování věku v Kalifornii, Coloradu a Brazílii. Jiný pull request, který tuto změnu napravoval, byl správcem projektu Lennartem Poetteringem zamítnut s následujícím zdůvodněním:
… více »Nové číslo časopisu Raspberry Pi zdarma ke čtení: Raspberry Pi Official Magazine 163 (pdf).
Eric Lengyel dobrovolně uvolnil jako volné dílo svůj patentovaný algoritmus Slug. Algoritmus vykresluje text a vektorovou grafiku na GPU přímo z dat Bézierových křivek, aniž by využíval texturové mapy obsahující jakékoli předem vypočítané nebo uložené obrázky a počítá přesné pokrytí pro ostré a škálovatelné zobrazení písma, referenční ukázka implementace v HLSL shaderech je na GitHubu. Slug je volným dílem od 17. března letošního
… více »Sashiko (GitHub) je open source automatizovaný systém pro revizi kódu linuxového jádra. Monitoruje veřejné mailing listy a hodnotí navrhované změny pomocí umělé inteligence. Výpočetní zdroje a LLM tokeny poskytuje Google.
Cambalache, tj. RAD (rapid application development) nástroj pro GTK 4 a GTK 3, dospěl po pěti letech vývoje do verze 1.0. Instalovat jej lze i z Flathubu.
KiCad (Wikipedie), sada svobodných softwarových nástrojů pro počítačový návrh elektronických zařízení (EDA), byl vydán v nové major verzi 10.0.0 (𝕏). Přehled novinek v příspěvku na blogu.
Letošní Turingovou cenu (2025 ACM A.M. Turing Award, Nobelova cena informatiky) získali Charles H. Bennett a Gilles Brassard za základní přínosy do oboru kvantové informatiky, které převrátily pojetí bezpečné neprolomitelné komunikace a výpočetní techniky. Jejich protokol BB84 z roku 1984 umožnil fyzikálně zaručený bezpečný přenos šifrovacích klíčů, zatímco jejich práce o kvantové teleportaci položila teoretické základy pro budoucí kvantový internet. Jejich práce spojila fyziku s informatikou a ovlivnila celou generaci vědců.
Firefox 149 dostupný od 24. března přinese bezplatnou vestavěnou VPN s 50 GB přenesených dat měsíčně (s CZ a SK se zatím nepočítá) a zobrazení dvou webových stránek vedle sebe v jednom panelu (split view). Firefox Labs 149 umožní přidat poznámky k panelům (tab notes, videoukázka).
Byla vydána nová stabilní verze 7.9 webového prohlížeče Vivaldi (Wikipedie). Postavena je na Chromiu 146. Přehled novinek i s náhledy v příspěvku na blogu.
Dle plánu byla vydána Opera GX pro Linux. Ke stažení je .deb i .rpm. V plánu je flatpak. Opera GX je webový prohlížeč zaměřený na hráče počítačových her.
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: