|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Nov 2003
Città: Pordenone - Tarvisio
Messaggi: 2451
|
[C++]Stringhe
Salve a tutti...
Ho un problema : devo fare un programma che date 2 stringhe in input verifichi la presenza di una nell'altra. Per ora ho fatto: Codice:
#include<iostream>
#include<cstdio>
using namespace std;
int main(void)
{
char stringa1[10],stringa2[10];
int i,lenght1,lenght2,j;
bool lol=false;
cout<<"Inserire la prima stringa ";
fgets(stringa1,10,stdin);
cout<<"Inserire la seconda stringa ";
fgets(stringa2,10,stdin);
lenght1=strlen(stringa1);
lenght2=strlen(stringa2);
if(lenght1>lenght2){
for(i=0;i<lenght1;i++)
{
for(j=0;j<lenght1;j++){
if(stringa2[j]==stringa1[i]) cout<<"Trovato un carattere comune"<<endl;
}
}
}
getchar();
}
__________________
Me? The Chosen One? They chose me, and i didn't even graduate from fuckin' high school Wind FTTE Vula 100/20 - Stats Retelit / Valcanale 20Mbit/2Mbit // Wind 100/20+Wind4G con EdgerouterX |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: May 2000
Messaggi: 1459
|
ciao, tipico problema di pattern matching. Io lo risolverei così (mi sembra sia corretto, cmq ora che posto lo ricontrollo ben indentato e casomai modifico
ciauz Codice:
#include<iostream>
#include<cstdio>
using namespace std;
bool stringaTrovata(char stringa1 [],char stringa2[],int startPos,int patternSize){
for(int i=0; i<patternSize; i++)
if(stringa1[startPos+i] != stringa2[i])
return false;
return true;
}
int main(void)
{
char stringa1[10],stringa2[10];
int i,lenght1,lenght2,j;
bool lol=false;
cout<<"Inserire la prima stringa ";
cin.getline(stringa1,10);
cout<<"Inserire la seconda stringa ";
cin.getline(stringa2,10);
lenght1=strlen(stringa1);
lenght2=strlen(stringa2);
if(lenght1>=lenght2){
for(i=0;i<=lenght1 - lenght2; i++)
if(stringaTrovata(stringa1,stringa2,i,lenght2))
cout <<"Stringa trovata in posizione " <<i <<endl;
}
getchar();
}
Ultima modifica di The3DProgrammer : 21-03-2005 alle 23:37. |
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 414
|
io consiglio di fare cosi:
Codice:
//ritorna la posizione di strin in str o -1 se non è presente
int instr(char * str, char * strin)
{
int i,k,n;
for( k=0,i=0;str[i]!='\0';i++)
{
if(str[i]==strin[k])k++;
else
{
if(k>0)
{
k=0;
i=n;
}
n=i;
}
if(strin[k]=='\0')break;
}
if(str[i]!='\0')return i-k+1;
else return -1;
}
int main()
{
//leggo le stringe
....
if(strlen(striga1)>strlen(striga1))instr(stringa1,stringa2);//se stringa1 è più
//lunga di stringa2 non può gli puo stare dentro
else instr(stringa2,stringa1);//viceversa
//resto codice
....
}
Ultima modifica di tglman : 22-03-2005 alle 11:39. |
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Re: [C++]Stringhe
<OT> Questo non è corretto:
Codice:
char stringa1[10];
fgets(stringa1,10,stdin);
stringa1[sizeof(stringa1)-1] = '\0'; altrimenti sei a rischio di overflow nella strlen.
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: Apr 2001
Città: Dundee, Scotland
Messaggi: 467
|
Invece di usare le stringhe C usa std::string e il metodo find.
Codice:
std::string stringa1;
std::string stringa2;
...
size_type idx=stringa1.find(stringa2.c_str());
if (idx!=npos)
{
// stringa2 contenuta in stringa1
}
|
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: Nov 2003
Città: Pordenone - Tarvisio
Messaggi: 2451
|
Grazie a tutti.
Se qualcuno ha voglia, mi sa dire perchè questo codice qua non si compila? Codice:
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#define DIM 10
#define DIM2 4
//automa
using namespace std;
void caricamento(char[][],char[][],char[][],char[][]);
void simulazione(char[][],char[][],char[][],char[][]);
void uscite();
int main(void)
{
char input[DIM][DIM2],stati[DIM][DIM2],matr_stato[DIM][DIM2],matr_uscite[DIM][DIM2];
char risp;
int scelta;
do{
cout<<"Programma automa "<<endl;
cout<<"1-carticamento vettori e matrici. "<<endl;
cout<<"2-simulaz."<<endl;
cout<<"3-Uscite. "<<endl;
cout<<"4-Esci. "<<endl;
cin>>scelta;
switch(scelta)
{
case 1:caricamento(input,stati,matr_stato,matr_uscite);break;
case 2:simulazione(input,stati,matr_stato,matr_uscite);break;
//case 3:uscite();break;
case 4:exit(0);break;
}
cout<<"Continuare? "<<endl;
cin>>risp;
}while(risp=='s');
cin.get();
}
//******************************************************************************
void caricamento(char input[][],char stati[][],char matr_stato[][],char matr_uscite[][])
{
int i,j,lenght1,lenght2;
bool trovato=false;
//valori di input
cout<<"Valori di input: "<<endl;
cin.ignore();
for(i=0;i<DIM;i++)
{
do{
cout<<i<<" : ";
//do{
lenght1=strlen(input[i]);
cin.getline(input[i],DIM2);
// }while(lenght1>3);
for(j=0;j<i;j++)
{
if(strcmp(input[i],input[j])==0)
{
trovato=true;
break;
}
}
}while(trovato==true);
}
//valori di stato
cout<<"Valori di stato "<<endl;
do{
for(i=0;i<DIM;i++)
{
cout<<i<<" : ";
//do{
lenght2=strlen(input[i]);
cin.getline(stati[i],DIM2);
// }while(lenght2>3);
for(j=0;j<i;j++)
{
if(strcmp(stati[i],stati[j])==0)
{
trovato=true;
break;
}
}
}
}while(trovato==true);
}
//******************************************************************************
void simulazione(char input[][],char stati[][],char matr_stato[][],char matr_uscite[][])
{
int i,j,pos_input,pos_stato;
char _input,_stato;
cout<<"Inserisci l'input: "<<endl;
cin.getline(_input);
/*ciclo per la ricerca dell'input
inserito dall'utente nella matrice di char contenente
tutti gli input inseriti precedentemente */
for(i=0;i<DIM;i++)
{
if(!strcmp(_input,input[i])) pos_input=i;
}
cout<<"Posizione trovata: "<<pos_input<<endl;
cout<<"Inserisci lo stato: "<<endl;
cin.getline(_stato);
/*ciclo per la ricerca dello
inserito dall'utente nella matrice di char contenente
tutti gli stati inseriti precedentemente */
for(i=0;i<DIM;i++)
{
if(!strcmp(_stato,stati[i])) pos_stato=i;
}
cout<<"Posizione trovata: "<<pos_stato;
}
__________________
Me? The Chosen One? They chose me, and i didn't even graduate from fuckin' high school Wind FTTE Vula 100/20 - Stats Retelit / Valcanale 20Mbit/2Mbit // Wind 100/20+Wind4G con EdgerouterX |
|
|
|
|
|
#7 | |
|
Senior Member
Iscritto dal: Nov 2000
Città: MILANO
Messaggi: 2662
|
Re: Re: [C++]Stringhe
Quote:
mmmh scusa non mi ricordo: so che il C iso lo mette lui automaticamente. e il C++ no? |
|
|
|
|
|
|
#8 | |
|
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Re: Re: Re: [C++]Stringhe
Quote:
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 12:28.



















