Byla vydána beta verze Linux Mintu 22.3 s kódovým jménem Zena. Podrobnosti v přehledu novinek a poznámkách k vydání. Vypíchnout lze, že nástroj Systémová hlášení (System Reports) získal mnoho nových funkcí a byl přejmenován na Informace o systému (System Information). Linux Mint 22.3 bude podporován do roku 2029.
GNU Project Debugger aneb GDB byl vydán ve verzi 17.1. Podrobný přehled novinek v souboru NEWS.
Josef Průša oznámil zveřejnění kompletních CAD souborů rámů tiskáren Prusa CORE One a CORE One L. Nejsou vydány pod obecnou veřejnou licenci GNU ani Creative Commons ale pod novou licencí OCL neboli Open Community License. Ta nepovoluje prodávat kompletní tiskárny či remixy založené na těchto zdrojích.
Nový CEO Mozilla Corporation Anthony Enzor-DeMeo tento týden prohlásil, že by se Firefox měl vyvinout v moderní AI prohlížeč. Po bouřlivých diskusích na redditu ujistil, že v nastavení Firefoxu bude existovat volba pro zakázání všech AI funkcí.
V pořadí šestou knihou autora Martina Malého, která vychází v Edici CZ.NIC, správce české národní domény, je titul Kity, bity, neurony. Kniha s podtitulem Moderní technologie pro hobby elektroniku přináší ucelený pohled na svět současných technologií a jejich praktické využití v domácích elektronických projektech. Tento knižní průvodce je ideální pro každého, kdo se chce podívat na současné trendy v oblasti hobby elektroniky, od
… více »Linux Foundation zveřejnila Výroční zprávu za rok 2025 (pdf). Příjmy Linux Foundation byly 311 miliónů dolarů. Výdaje 285 miliónů dolarů. Na podporu linuxového jádra (Linux Kernel Project) šlo 8,4 miliónu dolarů. Linux Foundation podporuje téměř 1 500 open source projektů.
Jean-Baptiste Mardelle se v příspěvku na blogu rozepsal o novinkám v nejnovější verzi 25.12.0 editoru videa Kdenlive (Wikipedie). Ke stažení také na Flathubu.
OpenZFS (Wikipedie), tj. implementace souborového systému ZFS pro Linux a FreeBSD, byl vydán ve verzi 2.4.0.
Kriminalisté z NCTEKK společně s českými i zahraničními kolegy objasnili mimořádně rozsáhlou trestnou činnost z oblasti kybernetické kriminality. V rámci operací OCTOPUS a CONNECT ukončili činnost čtyř call center na Ukrajině. V prvním případě se jednalo o podvodné investice, v případě druhém o podvodné telefonáty, při kterých se zločinci vydávali za policisty a pod legendou napadeného bankovního účtu okrádali své oběti o vysoké finanční částky.
Na lepší pokrytí mobilním signálem a dostupnější mobilní internet se mohou těšit cestující v Pendolinech, railjetech a InterPanterech Českých drah. Konsorcium firem ČD - Telematika a.s. a Kontron Transportation s.r.o. dokončilo instalaci 5G opakovačů mobilního signálu do jednotek Pendolino a InterPanter. Tento krok navazuje na zavedení této technologie v jednotkách Railjet z letošního jara.
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: