Byla vydána listopadová aktualizace aneb nová verze 1.85 editoru zdrojových kódů Visual Studio Code (Wikipedie). Přehled novinek i s náhledy a animovanými gify v poznámkách k vydání. Ve verzi 1.85 vyjde také VSCodium, tj. komunitní sestavení Visual Studia Code bez telemetrie a licenčních podmínek Microsoftu.
git.kernel.org je nově oficiálně také v tmavém vzhledu.
Richard Hughes na svém blogu oznámil, že počet aktualizací firmwarů pomocí služby LVFS (Linux Vendor Firmware Service) přesáhl 100 milionů. Přehled podporovaných zařízení, nejnovějších firmwarů nebo zapojených výrobců na stránkách LVFS.
Byla vydána nová stabilní verze 3.19.0, tj. první z nové řady 3.19, minimalistické linuxové distribuce zaměřené na bezpečnost Alpine Linux (Wikipedie) postavené na standardní knihovně jazyka C musl libc a BusyBoxu. Z novinek lze vypíchnou podporu Raspberry Pi 5.
Altap Salamander (Wikipedie), dvoupanelový správce souborů pro Windows, byl uvolněn jako open source pod názvem Open Salamander. Zdrojové kódy jsou k dispozici na GitHubu pod licencí GPLv2.
Společnost JetBrains představila (YouTube) svou umělou inteligenci JetBrains AI a nástroj AI Assistant v IDE.
Byla vydána nová verze 255 správce systému a služeb systemd (GitHub, NEWS). Z novinek lze vypíchnout například novou službu systemd-bsod.service.
Google představil Gemini, svůj největší a nejschopnější model umělé inteligence.
openSUSE komunita vybírá nová loga. Jedním z cílů je odlišit se od SUSE. Aktuálně probíhá hlasování o logu openSUSE a čtyř distribucí Tumbleweed, Leap, Slowroll a Kalpa.
Raspberry Pi OS, oficiální operační systém pro Raspberry Pi, byl vydán v nové verzi 2023-12-05. Přehled novinek v příspěvku na blogu a poznámkách k vydání. Nově jej lze používat také s tmavým tématem.
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: