PDA

View Full Version : metallica -----> etallicama


MetalMassacre
18-11-2002, 16:21
Ringrazio anticipatamente coloro che investono il loro tempo dandomi una mano...in particolar modo cionci...

tanto per cambià ho un nuovo quesito...

ho fatto un programma che memorizza una parola in un array di carateri, sposta la prima parola dietro l'ultima...eci aggiunge una 'a'......

Esempio. metallica -----> etallicama
pantera -----> anterapa
stratovarius ------> tratovariussa

ma....qualcosanon torna...nel senso che mi vien fuori

etallicam a
anterap a
tratovariuss a

e via dicendo.....

Consigli?


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

int main()
{int i=0;
char arr [DIM];
char *pa;
printf ("Scrivi una parola in inglese: \n");
scanf ("%[^\n]",arr);
pa=arr;


do {printf ("%c",*(pa+1));
b++;
pa++;}
while (*pa!='\0');

printf ("a");

system("PAUSE");
}
:D

bsummer
18-11-2002, 17:03
Per il semplice fatto che quando tu sei sull'ultimo carattere, gli fai stampare pa+1, cioe' il "\n".

Quindi quando esci dal ciclo hai gia' scritto il "\n" e la "a" non la scrivi di seguito alle altre lettere.

Questo e' il bug, per le possibili soluzioni, beh, ce ne sono diverse, basta usare la fantasia ;)

Bye

cionci
18-11-2002, 18:37
Sono d'accordissimo sui primi due gruppi...sul terzo no ;)

Ad esempio ci può essere una soluzione molto semplice al tuo esercizio :

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

int main()
{
char str[DIM];
scanf("%s", str);
printf("%s%ca\n", &str[1], str[0]);
system("PAUSE");
return 0;
}

Se invece vuoi lavorare sugli array...

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

int main()
{
char str[DIM];
char tmp;
int i;
scanf("%s", str);
tmp = str[0];
for(i = 0; str[i] != '\0'; ++i) /*guarda bene questo for */
str[i] = str[i+1]; /*nota il pre-incremento*/
str[i-1] = tmp;
printf("%sa\n", str);
system("PAUSE");
return 0;
}

MetalMassacre
18-11-2002, 19:59
Originariamente inviato da bsummer
[B]Per il semplice fatto che quando tu sei sull'ultimo carattere, gli fai stampare pa+1, cioe' il "\n".

Quindi quando esci dal ciclo hai gia' scritto il "\n" e la "a" non la scrivi di seguito alle altre lettere.

Questo e' il bug, per le possibili soluzioni, beh, ce ne sono diverse, basta usare la fantasia ;)

Bye


Scusa, ma a quale \n ti riferisci?
Non credo si aver capito...:(

Azie:)

MetalMassacre
18-11-2002, 20:11
Originariamente inviato da cionci
[B]Sono d'accordissimo sui primi due gruppi...sul terzo no ;)

Ad esempio ci può essere una soluzione molto semplice al tuo esercizio :

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

int main()
{
char str[DIM];
scanf("%s", str);
printf("%s%ca\n", &str[1], str[0]);
system("PAUSE");
return 0;
}

Se invece vuoi lavorare sugli array...

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

int main()
{
char str[DIM];
char tmp;
int i;
scanf("%s", str);
tmp = str[0];
for(i = 0; str[i] != '[QUOTE][i]Originariamente inviato da cionci [/i]
[B]Sono d'accordissimo sui primi due gruppi...sul terzo no ;)

Ad esempio ci può essere una soluzione molto semplice al tuo esercizio :
[code]
#include <stdio.h>
#include <stdlib.h>
#define DIM 30

int main()
{
char str[DIM];
scanf("%s", str);
printf("%s%ca\n", &str[1], str[0]);
system("PAUSE");
return 0;
}
[/code]
Se invece vuoi lavorare sugli array...
[code]
#include <stdio.h>
#include <stdlib.h>
#define DIM 30

int main()
{
char str[DIM];
char tmp;
int i;
scanf("%s", str);
tmp = str[0];
for(i = 0; str[i] != '\0'; ++i) /*guarda bene questo for */
str[i] = str[i+1]; /*nota il pre-incremento*/
str[i-1] = tmp;
printf("%sa\n", str);
system("PAUSE");
return 0;
}
[/code] [/B][/QUOTE]'; ++i) /*guarda bene questo for */
str[i] = str[i+1]; /*nota il pre-incremento*/
str[i-1] = tmp;
printf("%sa\n", str);
system("PAUSE");
return 0;
}



mmmCome sempre fottutamente impeccabile!!:D :D :D

ma aspetta...ci sono cose che non mi tornano .....

nel primo metodo
printf("%s%ca\n", &str[1], str[0]).....
vol dire che stampi l'array str a partire dal elemento[1] ?? ahh si puo? non sapevo....
e quel %ca sta per: "che ca..o?"
:D :confused:


ciao

cionci
18-11-2002, 20:17
In pratica tu stampavi anche lo '\0'...

Per riaggiustare tutto basta una cosa del genere :

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

int main()
{
int i=0;
char arr [DIM];
char *pa;
printf ("Scrivi una parola in inglese: \n");
scanf ("%[^\n]",arr);
pa=arr;


while(*(++pa)!='\0') {
printf ("%c",*pa);
}

printf ("%ca", arr[0]);

system("PAUSE");
}

cionci
18-11-2002, 20:22
Originariamente inviato da MetalMassacre
[B]nel primo metodo
printf("%s%ca\n", &str[1], str[0]).....
vol dire che stampi l'array str a partire dal elemento[1] ?? ahh si puo? non sapevo....
Gli array statici (quindi anche un vettore di char) in C non sono altro che puntatori non modificabili ad uno spazio già allocato... Quindi str preso così è il puntatore al primo elemento dell'array...str[1] ritorna il valore del secondo elemento dell'array...quindi &str[1] è l'indirizzo del secondo elemnto dell'array...che equivale a fare str+1 (usando l'aritmetica dei puntatori)...

%ca è %c che stampa un carattere (str[0] che va stampato in fondo)...mentre 'a' è la lettera che va aggiunta dopo l'ultimo carattere...

MetalMassacre
19-11-2002, 10:19
Originariamente inviato da cionci
[B]
Gli array statici (quindi anche un vettore di char) in C non sono altro che puntatori non modificabili ad uno spazio già allocato... Quindi str preso così è il puntatore al primo elemento dell'array...str[1] ritorna il valore del secondo elemento dell'array...quindi &str[1] è l'indirizzo del secondo elemnto dell'array...che equivale a fare str+1 (usando l'aritmetica dei puntatori)...

%ca è %c che stampa un carattere (str[0] che va stampato in fondo)...mentre 'a' è la lettera che va aggiunta dopo l'ultimo carattere...


quindi se non ho capito male... facendo %s &str[1] stampi una stringa di lettere successive a partire dal 2°elemento dell'array (dato che 'indice parte da 0)...
mentre con %ca &str[0] riprendi il primo elemento dell'array e lo fai riscrivere in coda con l'aggiunta della 'a'...

ma se avevo un array di numeri e volevo stampare dal secondo elem. in poi era lo stesso procedimento mettendo però %d&str[1] ? ma cosi facendo...non mi stamperebbe solo l'elemento corrispondente a quell'indirizzo di mem. dell'array?

:confused:

cionci
19-11-2002, 11:21
Attenzione io la & davanti a str[0] non ce l'ho messa...
Ti faccio delle equivalenze con l'aritmetica dei puntatori...almeno si capisce meglio :

&str[x] equivale a str+x : è l'indirizzo dell'x-esimo elemento del vettore (una stringa per definizione è un puntatore di tipo char ad un indirizzo di memoria, la stringa termina quando viene trobvato l'elemento '\0', quindi passando &str[x] alla printf stampo dall'x-esimo carattere fino allo '\0')

&str[0] equivale a str : indirizzo del primo elemento del vettore

str[0] equivale a *str : contenuto del primo elemento del vettore

str[x] equivale a *(str+x) : contenuto dell'x-esimo elemento del vettore

Se ci metti degli interi nel vettore non li puoi stampare tutti insieme con printf... Ma li devi stampare uno alla volta con printf("%d", str[i]);

bsummer
19-11-2002, 12:18
Originariamente inviato da MetalMassacre
[B]


Scusa, ma a quale \n ti riferisci?
Non credo si aver capito...:(

Azie:)

Si, scusa, ho messo "\n" invece di "\0".

Sorry :D

MetalMassacre
19-11-2002, 12:18
Originariamente inviato da cionci
Attenzione io la & davanti a str[0] non ce l'ho messa...
Ti faccio delle equivalenze con l'aritmetica dei puntatori...almeno si capisce meglio :

&str[x] equivale a str+x : è l'indirizzo dell'x-esimo elemento del vettore (una stringa per definizione è un puntatore di tipo char ad un indirizzo di memoria, la stringa termina quando viene trobvato l'elemento 'Originariamente inviato da cionci
[B]Attenzione io la & davanti a str[0] non ce l'ho messa...
Ti faccio delle equivalenze con l'aritmetica dei puntatori...almeno si capisce meglio :

&str[x] equivale a str+x : è l'indirizzo dell'x-esimo elemento del vettore (una stringa per definizione è un puntatore di tipo char ad un indirizzo di memoria, la stringa termina quando viene trobvato l'elemento '\0', quindi passando &str[x] alla printf stampo dall'x-esimo carattere fino allo '\0')

&str[0] equivale a str : indirizzo del primo elemento del vettore

str[0] equivale a *str : contenuto del primo elemento del vettore

str[x] equivale a *(str+x) : contenuto dell'x-esimo elemento del vettore

Se ci metti degli interi nel vettore non li puoi stampare tutti insieme con printf... Ma li devi stampare uno alla volta con printf("%d", str[i]); ', quindi passando &str[x] alla printf stampo dall'x-esimo carattere fino allo 'Originariamente inviato da cionci
Attenzione io la & davanti a str[0] non ce l'ho messa...
Ti faccio delle equivalenze con l'aritmetica dei puntatori...almeno si capisce meglio :

&str[x] equivale a str+x : è l'indirizzo dell'x-esimo elemento del vettore (una stringa per definizione è un puntatore di tipo char ad un indirizzo di memoria, la stringa termina quando viene trobvato l'elemento '\0', quindi passando &str[x] alla printf stampo dall'x-esimo carattere fino allo '\0')

&str[0] equivale a str : indirizzo del primo elemento del vettore

str[0] equivale a *str : contenuto del primo elemento del vettore

str[x] equivale a *(str+x) : contenuto dell'x-esimo elemento del vettore

Se ci metti degli interi nel vettore non li puoi stampare tutti insieme con printf... Ma li devi stampare uno alla volta con printf("%d", str[i]); ')

&str[0] equivale a str : indirizzo del primo elemento del vettore

str[0] equivale a *str : contenuto del primo elemento del vettore

str[x] equivale a *(str+x) : contenuto dell'x-esimo elemento del vettore

Se ci metti degli interi nel vettore non li puoi stampare tutti insieme con printf... Ma li devi stampare uno alla volta con printf("%d", str[i]);



Una cannonata! Secco fa a paja!!
Inizio a fare un po di confusione..adesso che gli argomenti diventano tanti...e tosti...

Grazie ancora a tutti!!

:)