Valkey (Wikipedie) byl vydán v nové major verzi 9.0. Valkey je fork Redisu.
Byly publikovány informace o kritické zranitelnosti v knihovně pro Rust async-tar a jejích forcích tokio-tar, krata-tokio-tar a astral-tokio-tar. Jedná se o zranitelnost CVE-2025-62518 s CVSS 8.1. Nálezci je pojmenovali TARmageddon.
AlmaLinux přinese s verzí 10.1 podporu btrfs. XFS bude stále jako výchozí filesystém, ale instalátor nabídne i btrfs. Více informací naleznete v oficiálním oznámení.
Společnost OpenAI představila svůj vlastní webový prohlížeč ChatGPT Atlas. Zatím je k dispozici pouze na macOS.
Desktopové prostředí KDE Plasma bylo vydáno ve verzi 6.5 (Mastodon). Přehled novinek i s videi a se snímky obrazovek v oficiálním oznámení. Podrobný přehled v seznamu změn.
Rodina jednodeskových počítačů Orange Pi se rozrostla (𝕏) o Orange Pi 6 Plus.
Na Humble Bundle běží akce Humble Tech Book Bundle: All Things Raspberry Pi by Raspberry Pi Press. Se slevou lze koupit elektronické knihy od nakladatelství Raspberry Pi Press a podpořit Raspberry Pi Press, Raspberry Pi Foundation North America nebo Humble.
Přidaný režim autonomního řízení vozidel Tesla Mad Max je dostupný pro vybrané zákazníky v programu EAP (Early Access Program). Nový režim je na silnici agresivnější, častěji mění pruhy a ne vždy dodržuje rychlostní limity. Agentura JPP spekuluje, že v Česku by se mohl nový režim namísto Mad Max jmenovat Mad Turek...
Byla vydána nová verze 9.18 z Debianu vycházející linuxové distribuce DietPi pro (nejenom) jednodeskové počítače. Nově také pro NanoPi R3S, R3S LTS, R76S a M5. Přehled novinek v poznámkách k vydání.
bat, tj. vylepšený cat se zvýrazňováním syntaxe a integrací s gitem, byl vydán ve verzi 0.26.0.
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: