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
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
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
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");
}
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:
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]);
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!!
:)
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.