Projekt openSUSE dnes, 3. listopadu 2026, oficiálně vydal openSUSE Leap 16.1, novou verzi své stabilní linuxové distribuce. Novinkou je také Immutable Mode, který nahrazuje dosavadní samostatnou distribuci openSUSE Leap Micro. Podrobnosti o novém vydání najdete v oficiálním oznámení nebo v českém překladu oznámení. Instalační obrazy jsou již dostupné na get.opensuse.org. Vydání společně oslavíme v pátek ve virtuálním baru a na … více »
Bylo oznámeno vydání Fedora Linuxu 45. Ve finální verzi vychází šest oficiálních edic: Fedora Workstation a Fedora KDE Plasma Desktop pro desktopové, Fedora Server pro serverové, Fedora Cloud pro cloudové nasazení, Fedora CoreOS pro ty, kteří preferují neměnné systémy a Fedora IoT pro internet věcí. Vedle nich jsou k dispozici také další atomické desktopy, spiny a laby. Podrobný přehled novinek v samostatných článcích na stránkách
… více »Vědci z MIT CSAIL představili koncept 'weight-space programming' a názorně předvedli, že pokročilé jazykové modely SI dokážou přímo číst a upravovat váhy neuronových sítí. Studie ukazuje, že modely nejen dokážou identifikovat účel sítí z pouhého nahlédnutí do jejich číselných vah, ale mohou i cíleně opravovat chyby a nedostatky, například GPT-6 Astra se změnou pouhých 0,016% vah open-weight modelu Qwen3.5-0.8B podařilo odstranit
… více »Organizátoři komunitního setkání nejen českých a slovenských správců sítí CSNOG 2027, které se uskuteční 20. a 21. ledna na půdě zlínské univerzity Tomáše Bati, oznámili prodloužení termínu pro zasílání abstraktů do programu akce. Zájemci se mohou hlásit prostřednictvím webu setkání do úterý 10. listopadu. Programová komise uvítá příspěvky věnované nejen správě sítí, ale také legislativě a regulaci nebo síťařským aktivitám studentů a pedagogů.
Bylo spuštěno předobjednávání zařízení Flipper One s Linuxem. Za 20 dolarů si lze koupit kupón a zajistit si tím speciální cenu 379 dolarů po spuštění kampaně na Kickstarteru.
Tor Browser, tj. fork webového prohlížeče Mozilla Firefox s integrovaným klientem sítě Tor přednastavený tak, aby přes tuto síť bezpečně komunikoval, byl vydán ve verzi 16.0. Postaven je na Firefoxu ESR 153. Vydána byla také nová verze 7.16 živé linuxové distribuce Tails (The Amnesic Incognito Live System), jež klade důraz na ochranu soukromí uživatelů a anonymitu. S Tor Browserem 16.0.
FreeTube, desktopový klient pro YouTube využívající lokální API, byl vydán ve verzi 0.26.0. Toto velké opravné vydání mj. vrací částečnou podporu živých přenosů nebo přepracovává zobrazování titulků a obecně nastavení videa v přehrávači – FreeTube umožňuje např. přehrávat video s větším zrychlením.
Další vlna kyberútoků zasáhla chladicí zařízení supermarketů v sedmi evropských zemích, Belgii, Lucembursku, Švédsku, Nizozemsku, Irsku, Estonsku a Finsku. Mrazáky se v některých prodejnách opět 'proměnily v trouby' a zahřály až na 50°C, což pochopitelně vedlo ke znehodnocení uskladněných potravin. Útoky navazují na podobný incident ve Francii z první poloviny října letošního roku, pachatel stále není znám.
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: