Newsgroup: it.comp.lang.c
Titolo: stringhe e puntatori

Salve a tutti, ringrazio in anticipo per ogni eventuale aiuto...il
problema e' il seguente:
da:
char str1[10] = { c, i, a, o};
char str2[10];
Vorrei che il programma analizzasse str2 partendo pero' dal secondo
carattere, ovvero posto che str2 sia:analizzare, io ottenga :nalizzare.
Suggerimenti?:)
Kael


Dal codice e dalle richieste si deduce che non hai molta familiarità con
questo linguaggio...(anzi non lo conosci proprio!)
Ti consiglio di studiarlo e non di postare queste cose patetiche
--------------------------------
Inviato via 
http://usenet.libero.it

Ok grazie dell'incoraggiamento, visto che questo post è solo servito ad
insulti gratuiti posso chiedere al moderatore di chiuderlo e cancellarlo
insieme all'altro che avevo scritto perchè non me lo visualizzava? Grazie

 ha scritto nel messaggio
news:Y7%Pa.36668$qa5.8...@news2.tin.it...

non so bene se e' quello che vuoi ...
char str1[10] = { c, i, a, o,/0};
char *str2 = (*str1 + 1);


1) questo gruppo non e` moderato
2) se usi un client news decente, puoi cancellare da solo i post (posto
che ormai in cache di Google ci sono andati, e da li` non li leva nessuno)
3) puntatori, questi sconosciuti:
<CODE>
/* ricorda che ogni stringa deve terminare con il carattere '\0'
 * Inoltre se specifichi immediatamente la stringa passando i valori
 * all'array, non hai bisogno di specificare la dimensione dello stesso
 */
char stringa[]={'c','i','a','o','\0'};
// la tua stringa
printf("%s",stringa);
// la tua stringa senza il char iniziale
printf("%s",stringa+sizeof(char));
/* Nota: potresti essere tentato di usare stringa+1, dato che
 * effettivamente per la maggior parte dei sistemi sizeof(char)=1, pero`
 * e` sconsigliabile, piu` che altro perche' non ti abitua ad una buona
 * programmazione
 */
</CODE>
Quello che devi sempre tener presente e` che in C gli array non esistono,
le stringhe neppure.
Sono tutti puntatori, e funzionano tutti con le regole dei puntatori.
Adieu,
-- 
Lestat de Lioncourt  -- a.k.a --  Ciro Mattia Gonano
 Undergraduate student in Computer Science at University of Bologna
 IHGGer #1049   <=>  ICQ#: 52631406   <=>   URL: 
http://www.CS.UniBO.It/~gonano
 Debian admin at 
Students.CS.UniBO.It
 <=> look at headers for my JabberID & GPG

 char *str2 = (*str1 + 1);
Cosě ottieni un segmentation fault. Corretta č:
char *str2 = str1 + 1;
Ciao

 Sono tutti puntatori, e funzionano tutti con le regole dei puntatori.
Gli array non sono puntatori, caso mai puoi dire che il nome dell'array
decade ad un puntatore al primo elemento dell'array, e non funzionano con le
regole dei puntatori.
Ciao

 </CODE>
Argh!!!
E' molto meglio scrivere stringa + 1 !!!
Supponi di avere un puntatore ad int (32 bits) pi. Se fai pi + 1 questo
puntera' a 4 bytes dopo. Se fai pi + sizeof(int) questo puntera' 16 bytes
dopo!!!
Nel tuo caso, visto che sizeof(char) e' sempre 1, "non da problemi", ma al
contrario di quello che dici usare sizeof(char) e' fonte di errore e non
usare +1 che e' invece giusto!
<CODE>
#include<stdio.h>
int main()
{
    int i[32]={0};
    int *pi=i;
    printf("%p\n",pi);
    pi = pi + 1;
    printf("%p\n",pi);
    pi = pi + sizeof(int);
    printf("%p\n",pi);
    return 0;
}
</CODE>
Questo codice produce:
<OUTPUT>
0012FE60
0012FE64
0012FE74
</OUTPUT>
(ovviamente i numeri in se possono cambiare!)
Come e' chiaro, "pi = pi +1" aumenta di 4, da 0012FE60 a 0012FE64.
"pi = pi + sizeof(int)" invece aumenta di 16!
Lestat de Lioncourt, sappiamo tutti che questa cosa la sapevi, che e' solo
una sciocchezza che ti e' uscita in un momento di confusione. Il problema e'
che questa cosa avresti potuto scriverla anche in un "vero" programma (anche
io e qualsiasi altra persona sul NG). Ecco perche' il C, ed i suoi puntatori
sono spesso fonte di bugs!
Io adoro i puntatori, ma rispetto i linguaggi di programmazione che hanno
deciso di non adottarli. (tra le altre cose rendono anche piu' difficile
ottimizzare il codice!)
Tommy

 dallo standard che sizeof(char) == 1 sempre.
Non era questo il problema....
Oggi i puntatori sembrano confondere tutti ;-)
(dettagli sull'altro mio post!)
Tommy

 (dettagli sull'altro mio post!)
È vero, hai ragione: il fatto è che ho considerato solo la frase "... per la
maggior parte dei sistemi sizeof(char) == 1 ..." e non il fatto che ptr + 1
in generale shifti il puntatore della dimensione a cui punta ptr
automaticamente!
È che quando vedo mettere in dubbio le certezze perdo il lume ;-p
Ciao


Statte bbono... Nun t'aggita' e che AlterX cia' raggione. Sei gnurante:
te devi da applica', devi da studia'.
Sinno' mica poi arriva' ar suo livello.
Mica tutti so' bboni a pontifica' su memoria dinamica persa, incece de
di' che er codice era sbajato prima de tutto pe artri motivi.
Pe lui e' pacifico ridimensiona' memoria allocata sullo stack e assegna'
memoria an vettore.
<CITE AlterX>
 > int i = 0;
 > char buffer[100]; //per leggere le stringhe senza sapere quanto
 > saranno lunghe
 > char temp[1]; //questa è quella che poi ridimensiono a seconda di quanto
 > è lungo l'input da tastiera
 > for (i = 0; i<n; i++){
 > printf("\nInserire la stringa: ");
 > gets(buffer);
 > temp=realloc(temp, strlen(buffer)); // ridimensiona in funzione della
 > lunghezza dell'input
 > temp = buffer; // ci copia dentro l'input
 > a[n] = &temp;
Perchè allochi memoria per contenere strlen(buffer) bytes, se poi assegni a
temp l'indirizzo di buffer, perdendo così la nuova memoria che resterà
sempre allocata!?!?
E poi perchè assegni l'indirizzo di temp anzicchè quello di buffer, visto
che puntano alla stessa memoria!?!?
Quando esegui il ciclo for e ad ogni iterazione chiedi di inserire i dati,
ti conviene anche pulire tutto il buffer che conterrà l'input dell'utente.
</CITE>
Me dispiace che tu, visto che sei gnurante, nun poi apprezza' a critica
der maestro. Oggi 'o shampoo e' toccato a te... Ma a rota ggira, forse
domani na' cazzata 'a dice lui e trova uno ggentile almeno qunat'e lui
che je rimbotta.
C:\>iao Angelo

  */
veramente puoi benissimo scrivere +1 anche se hai un array di float ...
anche perche' se il puntatore e' definito con il suo tipo il compilatore fa
gia' una somma con spiazzamento di size, cio' non succede se usi variabili.
almeno mi pare che sia quello che ho letto e capito dai vari discorsi e dal
libro ... magari ora lo rileggo che e' meglio.
ciao

 ha scritto nel messaggio
news:mM8Qa.171008$lK4.4...@twister1.libero.it...

e vai di cazziatoni :-p lo sapevo che stare zitto almeno non dimostravo la
mia ignoranza :-p
non e' vero e' che non ci ho pensato 5 minuti prima di rispondergli ed il
caldo e l'ora tarda hanno fatto il resto ... mea culpa ed ho sbagliato ...
cmq non so voi ma in sti giorni riuscire a fare 2 + 2 mi sta diventando
difficile ... sono nordico di pelle binachissima e sto da dio d'inverno a 15
gradi ora invece ne ho 36+umidita' in casa e veramente ho il cervello che
bolle quindi per tutto il periodo estivo non contate su quello che dico :-p
dai vabbe ciao ciao

 ha scritto nel messaggio
news:3F115D1B...@tiscalinet.it...


 Don Paolo.
Cosi' imparo a mandare post in romanesco...
Anche se e' stato attaccato a Kael era diretto ad AlterX, un po' troppo
spocchioso secondo il sottoscritto.
La traduzione a richiesta. :-)
Bacio le mani a vossia.
C:\>iao Angelo
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG

Sono tutti puntatori, e funzionano tutti con le regole dei puntatori.
Niente di più falso.  Le stringhe, d'altronde, non sono altro che
array di caratteri.  In C gli array esistono eccome e sono cosa ben
diversa dai puntatori, benché in molti casi gli array "decadino" in
puntatori.
-- 
Andrea Laforgia - a.laforgia(at)
libero.it
"There are three kinds of people in this world; 
 those who are good at maths and those who aren't".

 
e rispetto a Java, che ne pensi? :)
(in realta` e` retorica, come domanda, visto che in Java tutto e` un
puntatore, ma il programmatore non ha modo di utilizzare nessun
puntatore...)



<CODE>
char* str1;
char str2[]="ciao";
str1=malloc(5);
strcpy(str1,"ciao");
</CODE>
le due cose sono IDENTICHE al fine della rappresentazione su elaboratore,
ma il secondo e` un puntatore, il primo un array. Che sono la stessa cosa.
Un array altro non e` che un segmento di memoria al cui inizio fa
riferimento un puntatore... e questo e` scritto anche nel K&R!!!


 ma il secondo e` un puntatore, il primo un array. Che sono la stessa cosa.
NO! Puntatori e matrici sono due cose spesso intercambiabili ma *diverse*.
Per dimostrarlo, vedasi una mia risposta del 30 maggio, matrici,
http://www.google.it/groups?hl=it&lr=&ie=UTF-8&oe=UTF-8&threadm=bbn7ja%2424u%241%40lacerta.tiscalinet.it&rnum=1&prev=/groups%3Fas_q%3DPaolo%2520PAL%2520matrici%26ie%3DUTF-8%26oe%3DUTF-8%26lr%3D%26hl%3Dit
Ciao,
Paolo PAL
P.S.: Caspita, un thread di inizio luglio ripreso ad ottobre!

riferimento un puntatore... e questo e` scritto anche nel K&R!!!
Falso.
E` scritto nel K&R I versione, non in quello pubblicato poco prima
dello standard del linguagio.