Informatică, întrebare adresată de cosmaandra2000, 8 ani în urmă

Scrieţi programul C/C++ care citeşte de la tastatură, separate prin Enter, două şiruri de caractere: un şir s de maximum 255 de caractere, care pot fi litere ale alfabetului englez şi spaţii, apoi un şir c de maximum 20 de caractere. Programul va înlocui în şirul s toate apariţiile şirului c cu un şir de exact aceeaşi lungime efectivă cu c, format doar din caractere *, ca în exemplu. Şirul s obţinut în urma acestei prelucrări va fi afişat pe ecran. În cazul în care c nu apare în s, programul va afişa mesajul NU APARE.
Exemplu: dacă şirul S citit este Din departare se vede tare iar c este tare atunci pe ecran se va afişa: Din depar**** se vede ****


#include

#include

using namespace std;

int main()

{

char s[256], c[21], d[21], *p;

cin.get (s,256);

int i, n, c;

cin>>c;

n=strlen(s)  

for (i = 0; i <= n-1 ; i ++)

d[i] = ' * ';

d[n]='\0';

p=strtok(s, " ");

while( p != 0)

{ if ( strcmp ( p,c ) == 0)


Eu asa m-am gandit sa fac. Nu stiu exact in continuare cum e. Cu strcat cred.

Răspunsuri la întrebare

Răspuns de SKREFI
4

#include<iostream> #include<cstring> using namespace std;

int main(){

   char s[256]; cin.get(s,256); cin.ignore();

   char c[21]; cin.get(c,21);

   char * stelute; for(int i=0;i<strlen(c);i++) *(stelute+i) = '*';

   char * pch = strstr(s,c);

   if(pch == nullptr){

       cout<<"Nu apare";

       return 1;

   }

   while(pch != nullptr){

       strncpy(pch,stelute,strlen(c));

       pch = strstr(pch+1,c);

   }

   cout<<s<<endl;

}


Deci, m-am chinuit cu chestia asta mai bine de o ora, nu inteleg de ce, s-ar putea sa am eu probleme cu compilerul, incearca sa rulezi si vezi ce iese, eu, daca rulez asa, imi zice "Nu apare"

Daca ELIMIN whileul, merge, daca las doar cele 2 lini, merge pentru o aparitie, asa ca, trebuie sa copiez, daca dau input tare tare tare ENTER tare, si am copiat de 3 ori cele 2 lini de cod, functioneaza, daca pare acel WHILE universul se supara si face ca programul sa nu mai mearga si N-ARE NICI UN PIC DE SENS, adica gandestete ca nici nu ajunge in punctul ala  si... sper ca intelegi ce zic.


SKREFI: dai sterge tot dupa if inclusiv iful, dupa char * pch = ... dai cout<
SKREFI: Si bineinteles cauta sa vezi ce face strstr
cosmaandra2000: stiu, cauta un subisir intr-un sir
cosmaandra2000: aa cred ca partea aia se intreaba daca il gaseste pe c in sirul ala, dai mesaj. AA gata, si apoi dincolo, am inteles, bagi stelutele
SKREFI: daca nu exista sirul c in s, atunci pch care este um pointer, are valoare nulla, adica nullptr (null pointet, constanta din c++) in cazul ala afisam mesaj si returnam adica inchidem programul
SKREFI: ai marcat asta ca cel mai bun raspuns dar folosesti codul de pe pastebin da? =))
cosmaandra2000: da :)))
cosmaandra2000: pch = strstr(pch+1,c); Mai am o intrebare. Pentru ce e nevoie de asta ?
SKREFI: pai ce face strstr, gaseste si returneaza pointetul unde fix la inceput ai stringul c, daca ai "departare blabla tare mare" primul strstr returneaza "tare blabla tare mare" si inlocuim primele 4 caractere cu stelute, acum vrem sa vedem daca mai avem alt C in S, si apelam strstr cu pch+1, adica "are blabla tare mare" sau ma rog, sunt stelute in loc de "are" si gaseste urmatoarea aparitie "tare mare"
SKREFI: +1 acolo este ca sa elimine primul caracter din sirul gasit, ca sa nu-l mai ia dinou, ca asa s-ar bloca intr-un loop infinit, asta NU se intampla in cazul nostru pentru ca inlocuim acele caractere, dar daca ai vrea sa numeri de cate ori apare C in S, atunci ar fi nevoie de +1 acela, eu l-am pus din instinct...
Alte întrebări interesante