Dnešním dnem lze již také v Česku nakupovat na Google Store (telefony a sluchátka Google Pixel).
Apple představil (keynote) iPad Pro s čipem Apple M4, předělaný iPad Air ve dvou velikostech a nový Apple Pencil Pro.
Richard Biener oznámil vydání verze 14.1 (14.1.0) kolekce kompilátorů pro různé programovací jazyky GCC (GNU Compiler Collection). Jedná se o první stabilní verzi řady 14. Přehled změn, nových vlastností a oprav a aktualizovaná dokumentace na stránkách projektu. Některé zdrojové kódy, které bylo možné přeložit s předchozími verzemi GCC, bude nutné upravit.
Free Software Foundation zveřejnila ocenění Free Software Awards za rok 2023. Vybráni byli Bruno Haible za dlouhodobé příspěvky a správu knihovny Gnulib, nováček Nick Logozzo za front-end Parabolic pro yt-dlp a tým Mission logiciels libres francouzského státu za nasazování svobodného softwaru do praxe.
Před 10 lety Microsoft dokončil akvizici divize mobilních telefonů společnosti Nokia a pod značkou Microsoft Mobile ji zanedlouho pohřbil.
Fedora 40 release party v Praze proběhne v pátek 17. května od 18:30 v prostorách společnosti Etnetera Core na adrese Jankovcova 1037/49, Praha 7. Součástí bude program kratších přednášek o novinkách ve Fedoře.
Stack Overflow se dohodl s OpenAI o zpřístupnění obsahu Stack Overflow pro vylepšení OpenAI AI modelů.
AlmaLinux byl vydán v nové stabilní verzi 9.4 (Mastodon, 𝕏). S kódovým názvem Seafoam Ocelot. Přehled novinek v příspěvku na blogu a v poznámkách k vydání.
Před 50 lety, 5. května 1974 v žurnálu IEEE Transactions on Communications, Vint Cerf a Bob Kahn popsali protokol TCP (pdf).
Bylo vydáno do češtiny přeložené číslo 717 týdeníku WeeklyOSM přinášející zprávy ze světa OpenStreetMap.
#include malloc.h #include stdio.h #include stdlib.h typedef struct { char meno[10]; char priez[20]; int oscislo; char znamka; } STUD; void vlozStud(int *pocet) { (*pocet)++; } int main() { int pocet; char vyber; pocet=0; STUD *student; student=(STUD *) malloc(1*sizeof(student)); printf("%d\n",pocet); while (vyber!='x') { scanf("%s",&vyber); if(vyber=='b') vlozStud(&pocet); printf("%d",pocet); } printf("%d",pocet); return (0); }
<
' a '>
'? Pro ty línější nabízím pomůcku, kterou jsem kdysi vyrobil kvůli starému redakčnímu systému Intervalu, ale hodí se i zde.
Snažíš se zapsat řetězec na místo znaku. I když z klávesnice zadáš jenom "b", tak funkce scanf("%s", &vyber)
na adresu &vyber uloží "b\0" (C-čkové řetězce jsou zakončeny znakem "\0"). A ten nulovej znak přepíše něco, co už nepatří k tomu charu. (V tvém případě proměnnou pocet)
To, že na windows to funguje je způsobený pravděpodobně "zarovnávánim" proměných v paměti, který provádí překladač - zapisuješ někam, kde by stejně nic nebylo.
scanf("%s",&vyber);
Tak takové věci si raději hodně rychle odvykněte. Termín buffer overflow už jste slyšel? Tohle by byla sebevražda i kdyby proměnná vyber
nebyla typu char
.
char
a na místo, kam ukazuje, zkopírujete zadaný řetězec. Takže prvním znakem naplníte tu proměnnou a zbytkem přepíšete pár bytů za ním. Když budete mít štěstí, bude to pár jiných proměnných. Když ne, mohou se začít dít podivuhodné věci… V případě tazatele to zřejmě odnesla proměnná pocet
, která se nacházela na zásobníku hned nad vyber
.
scanf()
. Bez toho to nepůjde a pokud si toto nastudujete, bude vám hned jasné, v čem je problém. Fórum vám může pomoci s konkrétním problémem, ale základy jazyka si musíte nastudovat sám.
char *vyber;No a když je to takhle inicializováno, tak je potřeba paměť naalokovat
int N = 20; vyber = (char *) malloc (N * sizeof(char));a po použití uvolnit
free(vyber);Přičemž NIKDY nepoužívej scanf() tak jak jsi to zapsal. Když už to mermomocí musíš napsat právě takto, tak aspoň
scanf ("%19s", vyber);Abys omezil možnost buffer-overflow.
#include<string.h> #include<stdio.h> #include<stdlib.h> typedef struct { char meno[10]; char priez[20]; int oscislo; char znamka; } STUD; void vlozStud(int *pocet) { (*pocet)++; } int main() { int pocet, N = 20; char *vyber; STUD *student; pocet=0; student=(STUD *) malloc(1*sizeof(student)); vyber = (char *) malloc(N*sizeof(char)); printf("%d\n",pocet); while(1){ scanf("%19s", vyber); if (!strcmp(vyber, "x")) break; if (!strcmp(vyber, "b")) vlozStud(&pocet); printf("%d",pocet); } printf("%d",pocet); free(student); free(vyber); return (0); }(Chtěl jsem napsat ten program slušněji, ale to už bych ho příliš měnil.)
Nebo zkuste mezi
int pocet;
char vyber;
vložit nějakou proměnou, kterou dále v programu nijak nepoužijete (doufám, že ji kompilátor bez optimalizace nevyhodí, pokud ano, tak ji nějak nesmyslně použijte, aby zůstala v tom programu zachována). A spusťte program pod linuxem a zadejte jedno písmenko a program najednou bude chodit v pořádku.
Tiskni Sdílej: