Diskuze: Pomoc s Visual Studio 2017
V předchozím kvízu, Online test znalostí C++, jsme si ověřili nabyté zkušenosti z kurzu.
Člen
Zobrazeno 21 zpráv z 21.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Online test znalostí C++, jsme si ověřili nabyté zkušenosti z kurzu.
K tvému programu:
i <= (strlen(c)-strlen(a))
b[j] = '\0';
Není zač, poděl se o své řešení s ostatními. Mě osobně zajímá, zda-li si se úspěšně vyvaroval chyby s rozsahem pole.
#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(void)
{
char retazec[51], podretazec[4], novy_retazec[51];
int i = 0, j = 0;
fgets(retazec, 51, stdin);
int buffer = strlen(retazec) - 1;
if ((buffer > 0) && (retazec[buffer] == '\n')) retazec[buffer] = '\0';
setbuf(stdin, NULL);
fgets(podretazec, 4, stdin);
buffer = strlen(podretazec) - 1;
if ((buffer > 0) && (podretazec[buffer] == '\n')) podretazec[buffer] = '\0';
setbuf(stdin, NULL);
while (retazec[i] != '\0')
{
if ((retazec[i] == podretazec[0]) && (retazec[i + 1] == podretazec[1]) && (retazec[i + 2] == podretazec[2])) i += 3;
else
{
novy_retazec[j] = retazec[i];
j++;
i++;
}
}
novy_retazec[j] = '\0';
puts(novy_retazec);
system("PAUSE");
return 0;
}
Ano nejako sa mi to podairlo vyriesit
Jsi si jist že následující část programu je korektní?
if ((retazec[i] == podretazec[0]) && (retazec[i + 1] == podretazec[1]) && (retazec[i + 2] == podretazec[2])) i += 3;
výraz c[i] != '\0' je lépe zapisovat c[i]
Proč?
je to podobný jako psát
if (neco == true)
nebo
if (pNeco == NULL)
misto
if (neco)
nebo
if (pNeco)
je to zbytecne delsi
Je to osobní názor nebo to podporují i nějaký guidelines? Nedaří se mi o tom nic moc najít. Protože tohle je celkem blackmagic a člověk se musí pídit v kódu aby zjistil, čemu by se vlastně neco nebo pNeco mohlo rovnat aby se to vyhodnotilo jako false.
// dodatek: navíc mi to podobný nepříjde, porovnávát bool s true je docela nesmysl, ale char nebo bůhvíco dalšího?
Spíš osobní názor, ale porovnávat, jestli je něco nula prostě můžeš
bez toho porovnání s nulou, protože true je v céčku reprezentovaný
nenulovým číslem
0 = false = NULL = '\0'
(jinak ted koukam, ze u toho pointeru mam preklep, melo tam byt
if (!pNeco)
To ono to funguje, ale mějme následující definici:
char retazec[51];
Toto pole znaků dokáže pojmout 50 znaků + null znak, tedy poslední
položka je retazec[50]. Pokud toto pole naplníme hodnotami tak, že přesně
využijeme jeho paměť, pak jeho buffer nabývá indexů [0..49] a retazec[50]
je roven nulovému ukončovacímu znaku.
Podmínka:
while (retazec[i] != '\0')
nám udává, že cyklus běží až při i==49. A při i==49 nám výraz
(retazec[i + 1] == podretazec[1])
udává, že porovnávám nulový znak s druhým znakem pole podretazec a u výrazu
(retazec[i + 2] == podretazec[2])
dokonce porovnávám hodnotu, která je mimo rozsah pole retazec (Indexuji
51. prvek).
Proto je výraz:
if ((retazec[i] == podretazec[0]) && (retazec[i + 1] == podretazec[1]) && (retazec[i + 2] == podretazec[2])) i += 3;
nesprávný.
Ano viem co myslis. Ako by si to teda zapisal ty?
Třeba takto:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXBUF 50
#define SUBBUF 3
int main(void){
char retazec[MAXBUF + SUBBUF + 1];
char podretazec[SUBBUF + 1];
char novy_retazec[MAXBUF + 1];
char *pret;
char *ppod;
char *pnov;
pret = retazec;
ppod = podretazec;
pnov = novy_retazec;
memset(retazec, '\0', sizeof(retazec));
fgets(retazec, MAXBUF + 1, stdin);
memset(podretazec, '\0', sizeof(podretazec));
fgets(podretazec, SUBBUF + 1, stdin);
while (*pret) {
if ((*pret == *ppod) && (*(pret+1) == *(ppod+1) && (*(pret + 2) == *(ppod + 2)))) pret+=3;
else {
*pnov = *pret;
pret++;
pnov++;
}
}
*pnov = '\0';
puts(novy_retazec);
return 0;
}
Hmm zaujimave, su tam veci ktore sme v skole este neprebrali Budem musiet dostudovat navyse, Dakujem hned sa do toho pustim.
Bez ukazatelů:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#define MAXBUF 50
#define SUBBUF 3
int main(void){
char retazec[MAXBUF + SUBBUF + 1];
char podretazec[SUBBUF + 1];
char novy_retazec[MAXBUF + 1];
int i = 0;
int j = 0;
memset(retazec, '\0', sizeof(retazec));
fgets(retazec, MAXBUF + 1, stdin);
memset(podretazec, '\0', sizeof(podretazec));
fgets(podretazec, SUBBUF + 1, stdin);
while (retazec[i]){
if ((retazec[i] == podretazec[0]) && (retazec[i + 1] == podretazec[1]) && (retazec[i + 2] == podretazec[2])) i += 3;
else {
novy_retazec[j] = retazec[i];
j++;
i++;
}
}
novy_retazec[j] = '\0';
puts(novy_retazec);
return 0;
}
Snazim sa pochopit tym retazcom a sice to nevyzera tak tazko ako sa to najprv zdalo ale dnes sme v skole akurat zacali preberat ukazatele a dostali sme na domacu ulohu toto:
Napíšte program, ktorý načíta reťazec (povinne použite scanf(“%s“, ....) a vytvorí nový v ktorom každú hviezdičku zdvojí a každú bodku vymaže. Na obrazovku vypíše výsledný reťazec (pomocou jediného printf). Celé riešenie musí používať jediné pole (reťazec).
Ukážkový vstup: abd.fh↵
Ukážka výstupu: abdfh↵
Asi by som s tym potreboval mensiu pomoc pre lepsie pochopenie ukazatelov. Nejako neviem prist na to ako pouzit ukazatele na upravu retazca bez toho aby som si vytvoril nove pole. Dakujem
Ukážkový vstup: ab*d.f*h↵
Ukážka výstupu: ab**df**h↵
K tvé úloze:
Úloha se dá řešit i bez použití ukazatelů (o jejich použití v zadání není ani zmínka). K povinnému použití scanf() pro načtení řetězce se nebudu vyjadřovat. Nové pole není třeba vytvářet pokud máme pole pro uložení řetězce dostatečně velké. Jeho část se dá použít jako odkladiště a místo, kde se dají provádět potřebné úpravy. Už jste brali dynamickou alokaci paměti?
Zobrazeno 21 zpráv z 21.