Google postupně zpřístupňuje českým uživatelům Režim AI (AI Mode), tj. nový režim vyhledávání založený na umělé inteligenci. Režim AI nabízí pokročilé uvažování, multimodalitu a možnost prozkoumat jakékoliv téma do hloubky pomocí dodatečných dotazů a užitečných odkazů na weby.
Programovací jazyk Python byl vydán v nové major verzi 3.14.0. Podrobný přehled novinek v aktualizované dokumentaci.
Bylo oznámeno, že Qualcomm kupuje Arduino. Současně byla představena nová deska Arduino UNO Q se dvěma čipy: MPU Qualcomm Dragonwing QRB2210, na kterém může běžet Linux, a MCU STM32U585 a vývojové prostředí Arduino App Lab.
Multiplatformní open source voxelový herní engine Luanti byl vydán ve verzi 5.14.0. Podrobný přehled novinek v changelogu. Původně se jedná o Minecraftem inspirovaný Minetest v říjnu loňského roku přejmenovaný na Luanti.
Byla vydána nová stabilní verze 6.10 (YouTube) multiplatformního frameworku a GUI toolkitu Qt. Podrobný přehled novinek v poznámkách k vydání.
Netwide Assembler (NASM) byl vydán v nové major verzi 3.00. Přehled novinek v poznámkách k vydání v aktualizované dokumentaci.
Linuxová distribuce Frugalware (Wikipedie) ke konci roku 2025 oficiálně končí.
Byla vydána nová verze 3.0.6 svobodné aplikace pro úpravu a vytváření rastrové grafiky GIMP (GNU Image Manipulation Program). Přehled novinek v oznámení o vydání a v souboru NEWS na GitLabu. Nový GIMP bude brzy k dispozici také na Flathubu.
Americký výrobce čipů AMD uzavřel s americkou společností OpenAI smlouvu na několikaleté dodávky vyspělých mikročipů pro umělou inteligenci (AI). Součástí dohody je i předkupní právo OpenAI na přibližně desetiprocentní podíl v AMD.
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: