PROBLEMA Lettere in comune fra due stringhe - C programming

Pubblicità

Dario Salvati

Utente Attivo
Messaggi
1,401
Reazioni
247
Punteggio
87
Salve cari :3

Devo creare un programma in C che confronta due stringhe e stampa le lettere che hanno in comune.

Ho scritto il programma, e mi sembra che logicamente funzioni, ma quando lo eseguo crasha (capita quando faccio qualcosa male, ma dovreste saperlo meglio di me). Non sono riuscito a trovare l'errore, consigli?

Ecco il codice:

Codice:
#include <stdio.h>
#include <string.h>


int main()
{
    int i, j, k, l = 0;
    char parola[100], parola2[100], stampa[100];
    printf("Inserisci la prima parola: \n\n");
    scanf("%s", parola);
    printf("\n\nInserisci la seconda parola: \n\n");
    scanf("%s", parola2);
    for ( i = 0; i < strlen(parola); i++)
    {
        for (j = 0; j < strlen(parola2); j++)
        {
            if (parola[i] == parola2[j])
                stampa[k] = parola[i];
                k++;
        }
    }
    printf("Le lettere in comune fra le due parole sono: \n\n");
    for ( l = 0; l < strlen(stampa); l++)
    {
        printf("%c", stampa[l]);
    }
    int d = getchar();
    getchar();
    return 0;
}



Grazie per l'attenzione ^_^



PS: L'ho strutturato in questo modo perché vorrei riempire il terzo array senza le lettere che si ripetono.
 
f.c:18:24: warning: variable 'k' is uninitialized when used here [-Wuninitialized]
stampa[k] = parola;
Questo perché hai la brutta abitudine di dichiarare la variabili in gruppo, come in Pascal.

Inoltre
Codice:
if (parola[i] == parola2[j])
                stampa[k] = parola[i];
                k++;

dovrebbe essere
Codice:
if (parola[i] == parola2[j])
                stampa[k++] = parola[i];
oppure
Codice:
if (parola[i] == parola2[j])
{
                stampa[k] = parola[i];
                k++;
}

Infine, ti ricordo che scanf si ferma agli spazi e usato in quel modo espone a buffer overflow.

Buonaserata
 
Ultima modifica:
Al buffer overflow.
1- Non so cosa sia x)
2- Cosa dovrei usare al posto di scanf per evitare questo problema?
Perché, ripeto, il problema persiste anche dopo la modifica e da quello che ho capito è dovuto proprio a questo :C

Grazie mille per il tuo tempo!
Sono di fretta e sarò breve, scusami, ti invito ad approfondire online.
Tu predisponi che l'array conterrà 100 caratteri e lo leggi con scanf: tuttavia, quest'ultima continuerà a leggere finché non raggiungerà un \n o uno spazio (in generale).
Ma cosa succede se fosse inserita una stringa più grande di 100 caratteri? Un buffer overflow. Ossia, andresti a scrivere in locazioni di memoria oltre quelle dell'array. Questo è illegale e porterà a problemi (...).
Devi quindi limitare i caratteri letti. Ma di norma si utilizza la funzione fgets, che ti consiglio caldamente.

Se poi ti trovassi nella situazione che hai riempito il buffer, ma scanf/fgets ti indicano che c'è ancora da leggere, devi ricorrere a qualche altro metodo (allocazione dinamica tipicamente), ma la soluzione diviene un po' più complicata (...).
 
Capisco quello che vuoi dire, ma non riesco a capire dove si crea l'errore: ad esempio, se riempio i due array con massimo 4 - 5 parole, non si dovrebbe creare un buffer overflow. Da cosa è scaturito, quindi, il crash del programma?
 
Capisco quello che vuoi dire, ma non riesco a capire dove si crea l'errore: ad esempio, se riempio i due array con massimo 4 - 5 parole, non si dovrebbe creare un buffer overflow. Da cosa è scaturito, quindi, il crash del programma?
Non puoi inserire una frase, bensì solo una parola. Al momento scanf non è programmata per leggere oltre uno spazio!
Cioè "hello world" inserirà hello in "parola" e "world" in parola2.
 
Questo:

Codice:
            if (parola[i] == parola2[j])
                stampa[k] = parola[i];
                k++;


È diventato questo:

Codice:
            if (parola[i] == parola2[j])
                stampa[k++] = parola[i];

Ho provato anche così:


Codice:
            if (parola[i] == parola2[j])
{
                stampa[k] = parola[i];
                k++;
}

ma non cambia nulla :C
 
Intendevo con cosa provi. Ad esempio:
Codice:
Inserisci la prima parola: ciao mondo
Inserisci la seconda parola: ciao
Le lettere in comune fra le due parole sono: ciaooo // e si trova
Se vuoi che il risultato sia solo "ciao", devi effettuare una comparazione di N caratteri, dove N = length(stringa_piu_lunga)
 
La prima parola: cane
Seconda parola: casa

Dovrebbe stampare c, a, a, ma crasha.

Cioè, ho capito che non posso inserire più di una parola negli array x)
 
Ultima modifica:
Pubblicità
Pubblicità
Indietro
Top