Torna indietro   Hardware Upgrade Forum > Software > Programmazione

iPhone 18 Pro: la recensione del miglior iPhone compatto di sempre
iPhone 18 Pro: la recensione del miglior iPhone compatto di sempre
Apple ha rinnovato iPhone 18 Pro soprattutto dentro: chip A20 Pro a 2 nm con memoria affiancata al SoC, camera di vapore tre volte più ampia, Dynamic Island più piccola del 25% grazie a Face ID sotto il display e fotocamera principale con diaframma variabile da f/1.48 a f/4. Lo abbiamo misurato al colorimetro e nei benchmark, usato con iOS 27 e messo alla prova in fotografia tra laghi, borghi e interni poco illuminati
Panasonic, 30 anni di Toughbook: la "Bibbia" di mille regole dietro i nuovi G3 e 34
Panasonic, 30 anni di Toughbook: la "Bibbia" di mille regole dietro i nuovi G3 e 34
A Londra, per il trentennale dei Toughbook, Panasonic ha presentato il tablet G3 e il 2-in-1 34. Con Jon Tucker, a capo dell'ingegneria europea, abbiamo parlato di ciò che non si vede: batterie, antenne, porte seriali e accorgimenti nati sul campo
realme C100x, lo smartphone economico con la batteria da 7500 mAh. La recensione
realme C100x, lo smartphone economico con la batteria da 7500 mAh. La recensione
realme C100x scommette tutto, forse troppo, sulla batteria da 7500 mAh e sulla certificazione ArmorShell per farsi notare nella fascia più economica del mercato: lo abbiamo messo alla prova per capire a chi è rivolto questo smartphone che sacrifica un po' prestazioni, display e fotocamera per offrire l'autonomia migliore possibile a un prezzo decisamente contenuto
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 22-01-2012, 01:39   #1
mistergks
Senior Member
 
L'Avatar di mistergks
 
Iscritto dal: Mar 2011
Messaggi: 1050
[C++] Funzione cancella stringa

Ho provato a fare questo esercizio:
ho due stringhe (come array di char) A={"CIAO"}; B={"AI"}.
Devo eliminare in A ogni lettera presente in B e mettere la nuova parola in un nuovo array di char C.
Ho pensato di controllare le lettere uguali con due for e di inserire asterischi al posto delle lettere uguali in A. poi successivamente vado a mettere nell array C solo le lettere diverse da asterisco.
Dovrebbe stampare la stringa CO invece stampa COAI. cosa non va?
CODICE
Codice:
#include <iostream>
using namespace std;

void cancella(char A[], char B[], char C[]);

int main(){
    char A[]={"CIAO"};
    char B[]={"AI"};
    char C[]={" "};
    
    cancella(A,B,C);
    for(int i=0; i<strlen(C); i++)
    cout<<C[i]<<endl;
    
system("pause");
return 0;
}

void cancella(char A[], char B[], char C[]){
     int n=0;
     for(int i=0; i<strlen(A); i++){
             for(int j=0; j<strlen(B); j++){
                     if(A[i]==B[j])
                     A[i]='*';
                     
                     }
             }
     for(int k=0; k<strlen(A); k++){
             if(A[k]!='*')
             C[n++]=A[k];
             }
}
mistergks è offline   Rispondi citando il messaggio o parte di esso
Old 22-01-2012, 09:11   #2
vendettaaaaa
Senior Member
 
L'Avatar di vendettaaaaa
 
Iscritto dal: Jan 2012
Messaggi: 1267
Quote:
Originariamente inviato da mistergks Guarda i messaggi
Ho provato a fare questo esercizio:
ho due stringhe (come array di char) A={"CIAO"}; B={"AI"}.
Devo eliminare in A ogni lettera presente in B e mettere la nuova parola in un nuovo array di char C.
Ho pensato di controllare le lettere uguali con due for e di inserire asterischi al posto delle lettere uguali in A. poi successivamente vado a mettere nell array C solo le lettere diverse da asterisco.
Dovrebbe stampare la stringa CO invece stampa COAI. cosa non va?
CODICE
Codice:
#include <iostream>
using namespace std;

void cancella(char A[], char B[], char C[]);

int main(){
    char A[]={"CIAO"};
    char B[]={"AI"};
    char C[]={" "};
    
    cancella(A,B,C);
    for(int i=0; i<strlen(C); i++)
    cout<<C[i]<<endl;
    
system("pause");
return 0;
}

void cancella(char A[], char B[], char C[]){
     int n=0;
     for(int i=0; i<strlen(A); i++){
             for(int j=0; j<strlen(B); j++){
                     if(A[i]==B[j])
                     A[i]='*';
                     
                     }
             }
     for(int k=0; k<strlen(A); k++){
             if(A[k]!='*')
             C[n++]=A[k];
             }
}
Gli array non sanno che dimensione hanno, e per di più ridimensionarli è un casino. Non aumentano la loro dimensione da soli se gli dai un indice più grande del loro range. Quindi quando scrivi C[n++], quando n > 0, chissà cosa succede in memoria. Io ho questo output con strlen(C) == 14:
Codice:
C
O
[
[
[
[
[
[
[
[
[
[
A
I
Quindi direi che il minimo è dimensionare, nel main, C uguale ad A:
Codice:
char A[100] = {"CIAO"};
char C[100];
Non so bene come fare il ridimensionamento dinamico con malloc() perchè gli array praticamente non li ho mai usati, meglio usare vector che sono ridimensionabili e hanno un sacco di funzioni.
C'è un altro "errore":
Codice:
C[n++] = A[k];
è sbagliato concettualmente perchè il risultato è equivalente a:
Codice:
C[n] = A[k];
++n;
ma rischi di sbagliare in quanto l'ordine di priorità rispetto ad altri operatori potrebbe non essere quello che ti aspetti. Inoltre se leggi 2 volte in una riga il valore di una variabile che in quella stessa riga viene scritta il risultato è indefinito (così dice il creatore del C++): espressioni tipo
Codice:
(++i) + (++i)
sono indefinite. Il codice funzionante è questo:
Codice:
#include <iostream>

using namespace std;

void cancella(char A[], char B[], char C[]);

int main() {
	char A[100] = {"CIAO"};
	char B[100] = {"AI"};
	char C[100] = {""};
    
	cancella(A,B,C);
	for(int i = 0; i < strlen(A); ++i) cout << A[i];
	cout << "\nstrlen(A) = " << strlen(A) << endl;
	for(int i = 0; i < strlen(B); ++i) cout << B[i];
	cout << "\nstrlen(B) = " << strlen(A) << endl;
	for(int i = 0; i < strlen(C); ++i) cout << C[i];
	cout << "\nstrlen(C) = " << strlen(C) << endl;

	system("pause");
	return 0;

	int i = 1;
	int j = ++i + i++;
	cout << endl << endl << j << endl << endl;
}

void cancella(char A[], char B[], char C[]) {
	int n = 0;
	for (int i = 0; i < strlen(A); ++i) {
		for (int j = 0; j < strlen(B); ++j) {
				if (A[i] == B[j]) A[i] = '*';
                                break;
		}
	}
    
	for (int k = 0; k < strlen(A); ++k) {
		if (A[k] != '*') {
			C[n] = A[k];
			++n;
		}
	}
}

Ultima modifica di vendettaaaaa : 22-01-2012 alle 09:15.
vendettaaaaa è offline   Rispondi citando il messaggio o parte di esso
Old 23-01-2012, 12:20   #3
mistergks
Senior Member
 
L'Avatar di mistergks
 
Iscritto dal: Mar 2011
Messaggi: 1050
Quote:
Originariamente inviato da vendettaaaaa Guarda i messaggi
Gli array non sanno che dimensione hanno, e per di più ridimensionarli è un casino. Non aumentano la loro dimensione da soli se gli dai un indice più grande del loro range. Quindi quando scrivi C[n++], quando n > 0, chissà cosa succede in memoria. Io ho questo output con strlen(C) == 14:
Codice:
C
O
[
[
[
[
[
[
[
[
[
[
A
I
Quindi direi che il minimo è dimensionare, nel main, C uguale ad A:
Codice:
char A[100] = {"CIAO"};
char C[100];
Non so bene come fare il ridimensionamento dinamico con malloc() perchè gli array praticamente non li ho mai usati, meglio usare vector che sono ridimensionabili e hanno un sacco di funzioni.
C'è un altro "errore":
Codice:
C[n++] = A[k];
è sbagliato concettualmente perchè il risultato è equivalente a:
Codice:
C[n] = A[k];
++n;
ma rischi di sbagliare in quanto l'ordine di priorità rispetto ad altri operatori potrebbe non essere quello che ti aspetti. Inoltre se leggi 2 volte in una riga il valore di una variabile che in quella stessa riga viene scritta il risultato è indefinito (così dice il creatore del C++): espressioni tipo
Codice:
(++i) + (++i)
sono indefinite. Il codice funzionante è questo:
Codice:
#include <iostream>

using namespace std;

void cancella(char A[], char B[], char C[]);

int main() {
	char A[100] = {"CIAO"};
	char B[100] = {"AI"};
	char C[100] = {""};
    
	cancella(A,B,C);
	for(int i = 0; i < strlen(A); ++i) cout << A[i];
	cout << "\nstrlen(A) = " << strlen(A) << endl;
	for(int i = 0; i < strlen(B); ++i) cout << B[i];
	cout << "\nstrlen(B) = " << strlen(A) << endl;
	for(int i = 0; i < strlen(C); ++i) cout << C[i];
	cout << "\nstrlen(C) = " << strlen(C) << endl;

	system("pause");
	return 0;

	int i = 1;
	int j = ++i + i++;
	cout << endl << endl << j << endl << endl;
}

void cancella(char A[], char B[], char C[]) {
	int n = 0;
	for (int i = 0; i < strlen(A); ++i) {
		for (int j = 0; j < strlen(B); ++j) {
				if (A[i] == B[j]) A[i] = '*';
                                break;
		}
	}
    
	for (int k = 0; k < strlen(A); ++k) {
		if (A[k] != '*') {
			C[n] = A[k];
			++n;
		}
	}
}
a me il tuo codice stampa:
Codice:
CI*O
strlen(A)=4;
AI
strlen(B)=4
CIO
strlen(C)=3
non dovrebbe stamparmi la stringa CO alla fine?!toglie solo la A?
mistergks è offline   Rispondi citando il messaggio o parte di esso
Old 23-01-2012, 14:05   #4
vendettaaaaa
Senior Member
 
L'Avatar di vendettaaaaa
 
Iscritto dal: Jan 2012
Messaggi: 1267
Non mi ricordo perchè ma dopo aver testato il codice ho aggiunto un break nel ciclo for che cancella le lettere di A, è quello il problema.
Ora ricordo, il break l'ho aggiunto qui direttamente nel post ma andrebbe nel blocco if che sta nel blocco for (j = 0...):
Codice:
void cancella(char A[], char B[], char C[]) {
	int n = 0;
	for (int i = 0; i < strlen(A); ++i) {
		for (int j = 0; j < strlen(B); ++j) {
			if (A[i] == B[j]) {
				A[i] = '*';
				break;
			}
		}
	}
Così se la lettera di A viene trovata in B, viene cancellata e viene interrotta la scansione di B per risparmiare preziosissimi cicli di clock

Alternativamente si può fare così:
Codice:
void cancella(char A[], char B[], char C[]) {
	int n = 0;
	for (int j = 0; j < strlen(B); ++j) {
		for (int i = 0; i < strlen(A); ++i) {
			if (B[j] == A[i]) A[i] = '*';
		}
	}
Che mi pare meglio nel caso A contenga lettere ripetute (prova con "CIAAAAAO").

Ultima modifica di vendettaaaaa : 23-01-2012 alle 14:14.
vendettaaaaa è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


iPhone 18 Pro: la recensione del miglior iPhone compatto di sempre iPhone 18 Pro: la recensione del miglior iPhone ...
Panasonic, 30 anni di Toughbook: la "Bibbia" di mille regole dietro i nuovi G3 e 34 Panasonic, 30 anni di Toughbook: la "Bibbia...
realme C100x, lo smartphone economico con la batteria da 7500 mAh. La recensione realme C100x, lo smartphone economico con la bat...
Star Wars Zero Company è l'erede di XCOM 2 Star Wars Zero Company è l'erede di XCOM ...
Test ride Can-Am Origin: la moto elettrica che fa dimenticare il motore a scoppio (ma occhio all'autonomia) Test ride Can-Am Origin: la moto elettrica che f...
IA locale più veloce e aperta: Hugging F...
Framework Desktop con 192 GB di RAM subi...
Silicon Box a Novara, qualcosa si muove:...
Hyundai IONIQ V: la berlina da 800 volt ...
Offerte Prime anticipate, speciale porta...
Trump riunisce i CEO delle big tech e ca...
BLUETTI scatenata per i Prime Big Deal D...
Google ingaggia Henry Cavill: l'attore s...
vivo X Fold6 è ufficiale in Itali...
La Francia resta protagonista di eFootba...
AI Video Verification, la sicurezza pred...
BYD Seagull (Dolphin Surf), nuove immagi...
Windows 11 26H2, disponibili le ISO uffi...
Xiaomi 17 crolla a 799€: 200€ in meno pe...
UGREEN presenta i nuovi NASync DXP6800 U...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 12:19.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v