PDA

View Full Version : Stringa


MetalMassacre
25-11-2002, 21:00
Ciao a tutti....
'sto giro devo fare un programma che data una riga di testo in input la memorizza in una stringa con al+ 80 caratteri...e PER OGNI PAROLA DELLA STRINGA ne visualizzi il corrispettivo in piglatin

cioe traduca ogni parola in questo modo:

montagna -------> ontagnama


io l'ho fatto così.....ma mi da uno strano problema di compilazione...che non capisco (all'interno della procedura)....




#include <stdlib.h>
#include <stdio.h>
#define DIM 80

void piglatin (char arr[], int dim)
{char *p=arr;
char *c;
for (c=arr[1]; c<=arr[dim-1]; c++)
printf ("%c", *c);
printf ("%ca ",p);
}


int main()
{int g=0;
char riga [DIM];
char a [DIM];
char *p;
printf ("Scrivi una riga di testo\n");
scanf ("%s",riga);
for (p=riga; p<&riga[DIM]; p++,g++)
{if (*p!=' ')
a[g]=*p;
else{
p++;
piglatin (a,g);
g=0;}

system("PAUSE");
return 0;
}

lombardp
26-11-2002, 08:42
Secondo me è perché confronti C (che è un puntatore) con ARR[1] e ARR[DIM-1] (che sono char).

Non so se è corretto, però io avrei confrontato C con &ARR[1] e con &ARR[DIM-1].

MetalMassacre
26-11-2002, 10:14
Originariamente inviato da lombardp
[B]Secondo me è perché confronti C (che è un puntatore) con ARR[1] e ARR[DIM-1] (che sono char).

Non so se è corretto, però io avrei confrontato C con &ARR[1] e con &ARR[DIM-1].

Boh non mi sembra sbagliato, c è un puntatore che riceve come valore un indirizzo...in questo caso l'indirizzo [1] dell'array e gli faccio scorrere tutto l'array...

o no?

:(

cionci
26-11-2002, 10:53
Originariamente inviato da MetalMassacre
[B]
o no?

:(
No... arr è un puntatore al primo elemento del vettore...

arr[1] è il contenuto del secondo elemento...

arr[1] equivale a *(arr+1)
&arr[1] eqivale a (arr+1)

MetalMassacre
26-11-2002, 13:39
Originariamente inviato da cionci
[B]
No... arr è un puntatore al primo elemento del vettore...

arr[1] è il contenuto del secondo elemento...

arr[1] equivale a *(arr+1)
&arr[1] eqivale a (arr+1)


ah sì ok ho capito....non mi rendevo conto dell'errore...ora però il compilatore mi dice

"parse error at end of input"
in corrisponmdenza di righe vuote dopo il codice...... che vol dire??

cionci
26-11-2002, 15:43
Manca una grafa chiusa prima di system("PAUSE");

Le grafe mettile da sole in un raga...non come fai ora...altrimenti non ci capisci neinte...

MetalMassacre
26-11-2002, 20:29
ho provato a renderlo piu leggibile...così compila ma...uffffff non ne faccio uno giusto al primo colpo che balle!!!
ma concettualmente mi sembra giusto!:rolleyes:

cionci
27-11-2002, 09:12
Attento che la scanf con parametro %s legge una sola parola dall'input (mentre la printf stampa fino alla fine della stringa)...
Usa la gets al posto della scanf...

MetalMassacre
27-11-2002, 09:56
Originariamente inviato da cionci
[B]Attento che la scanf con parametro %s legge una sola parola dall'input (mentre la printf stampa fino alla fine della stringa)...
Usa la gets al posto della scanf...


Grazie,
mettendo gets (novità per quanto mi riguarda) il compilatore mi dice: too many arguments to function `gets'
:confused:

come mai?

cionci
27-11-2002, 10:00
Perchè la gets serve solo per le stringhe...

gets(riga);

MetalMassacre
27-11-2002, 13:40
Originariamente inviato da cionci
[B]Perchè la gets serve solo per le stringhe...

gets(riga);


nel mio caso sono piu di una le stringhe...potrei assegnare ogni stringa ad una cella di un nuovo array...

MetalMassacre
27-11-2002, 15:18
cionci...
ma giuda stitico!!!!!!
non ci riesco ma...ma... ma.... can del vacca!!!
ufff ci sto smanettando su ancora ma ormai sono andato in balla!


allora la procedura va ...almeno sono piuttosto convinto perche l'ho provata a parte....
ma per il resto meno di 0 secondo te puo andare come impostazione...come idea di fondo?
-carico in un array tutta una stringa
-con un puntatore inizio a scorrere l'array e passo ogni carattere in un altro array a[] , quando trovo uno spazio avvio la procedura piglatin sul contenuto dell array a che in teoria contiene la prima parola...
-fatta "la traduzione" della prima parola....procedo scorrendo l'array iniziale dalla posizione "dopo" lo spazio....e riinizio a caricare l'array a[] che a cui ho riimpostato l'indice a 0...



#include <stdlib.h>
#include <stdio.h>
#define DIM 80

piglatin (char arr[], int dim)
{
char *p=&arr[0];
char *c;
for (c=&arr[1]; c<=&arr[dim-1]; c++)
printf ("%c", *c);
printf ("%ca ",*p);
}



int main()
{
int g=0;
char riga [DIM];
char a [DIM];
char *p;
printf ("Scrivi una riga di testo\n");
scanf ("%s",&riga[0]);
for (p=&riga[0]; p<&riga[DIM]; p++,g++)
{if (*p!=' ')
a[g]=*p;
else{
p++;
piglatin (a,g);
g=0;
}
}
system("PAUSE");
return 0;
}



ma non va una "inchiama" :D
provo a trovare un diverso approcio...

MetalMassacre
27-11-2002, 15:18
.

MetalMassacre
27-11-2002, 15:18
.

MetalMassacre
27-11-2002, 15:18
.

MetalMassacre
27-11-2002, 15:18
.

MetalMassacre
27-11-2002, 15:18
.

MetalMassacre
27-11-2002, 15:19
Scusate ho fatto un disastro...:eek:

cionci
27-11-2002, 15:21
Originariamente inviato da MetalMassacre
[B]nel mio caso sono piu di una le stringhe...potrei assegnare ogni stringa ad una cella di un nuovo array...
Tu hai detto che devi leggere una riga... La gets legge una riga di testo...fino allo \n...

Altra soluzione fare una lettura carattere per carattere fino a quando viene immesso un \n o sono stati immessi 80 caratteri...
In questo caso dovrai mettere manualmente lo \0 in fondo dopo l'ultimo carattere letto...

cionci
27-11-2002, 15:49
Secondo me stai facendo difficili le cose semplici...
Comunque ti ho corretto il codice...


#include <stdlib.h>
#include <stdio.h>
#define DIM 80

void piglatin (char arr[], int dim)
{
char *p=&arr[0];
char *c;
for (c=&arr[1]; c<=&arr[dim-1]; c++)
printf ("%c", *c);
printf ("%ca ",*p);
}



int main()
{
int g=0;
char riga [DIM];
char a [DIM];
char *p;
printf ("Scrivi una riga di testo\n");
gets (riga);
for (p=&riga[0]; p<&riga[DIM]; p++)
{
if (*p == '\0')
{
if(g > 0)
piglatin(a, g);
break; /*se raggiungo la fine della strina esco*/
}
if (*p!=' ')
a[g++]=*p;
else
{
if(g > 0)
piglatin (a,g);
g=0;
}
}
system("PAUSE");
return 0;
}

MetalMassacre
29-11-2002, 16:37
Originariamente inviato da cionci
[B]Secondo me stai facendo difficili le cose semplici...
Comunque ti ho corretto il codice...


#include <stdlib.h>
#include <stdio.h>
#define DIM 80

void piglatin (char arr[], int dim)
{
char *p=&arr[0];
char *c;
for (c=&arr[1]; c<=&arr[dim-1]; c++)
printf ("%c", *c);
printf ("%ca ",*p);
}



int main()
{
int g=0;
char riga [DIM];
char a [DIM];
char *p;
printf ("Scrivi una riga di testo\n");
gets (riga);
for (p=&riga[0]; p<&riga[DIM]; p++)
{
if (*p == '[QUOTE][i]Originariamente inviato da cionci [/i]
[B]Secondo me stai facendo difficili le cose semplici...
Comunque ti ho corretto il codice...

[code]
#include <stdlib.h>
#include <stdio.h>
#define DIM 80

void piglatin (char arr[], int dim)
{
char *p=&arr[0];
char *c;
for (c=&arr[1]; c<=&arr[dim-1]; c++)
printf ("%c", *c);
printf ("%ca ",*p);
}



int main()
{
int g=0;
char riga [DIM];
char a [DIM];
char *p;
printf ("Scrivi una riga di testo\n");
gets (riga);
for (p=&riga[0]; p<&riga[DIM]; p++)
{
if (*p == '\0')
{
if(g > 0)
piglatin(a, g);
break; /*se raggiungo la fine della strina esco*/
}
if (*p!=' ')
a[g++]=*p;
else
{
if(g > 0)
piglatin (a,g);
g=0;
}
}
system("PAUSE");
return 0;
}
[/code] [/B][/QUOTE]')
{
if(g > 0)
piglatin(a, g);
break; /*se raggiungo la fine della strina esco*/
}
if (*p!=' ')
a[g++]=*p;
else
{
if(g > 0)
piglatin (a,g);
g=0;
}
}
system("PAUSE");
return 0;
}



Hei cionci...
ma perchè a te vine così semplice?!? arrrrrgh!!:mad:
perche io devo morir matto ogni volta?
cmq lo sto provando in altri 2 modi...appena ho modo di tornarci su te li dirò....ma porc..!

cionci
29-11-2002, 19:09
Originariamente inviato da MetalMassacre
[B]Hei cionci...
ma perchè a te vine così semplice?!?
Forse perchè è più di dieci anni che programmo in C ;)
Non ti preoccupare... Le difficolta è chiaro che ci siano all'inizio...