PDA

Visualizza la versione completa : [C] Ordinamento stringa di caratteri


bianchi88
02-01-2010, 14:16
Buon giorno a tutti, non riesco a compilare questo programma mi da sempre segmentation fault, lo scopo di questo esercizio è che non avendo capito ancora bene l'uso di doppio puntatori ho implementato un esercizio "prova" per scambiare i caratteri in ordine alfabetico.
esempio:
input: ciao
output: acio

input: prova
output: aporv

ecco il codice:




#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<ctype.h>
void BubbleSort_string(char **s,int n);
void visualizza(char *s,int n);

int main(){

char s[100];
int i,n=0,c;

while ((c=getchar()!='\n')){
s[i]=c;
i++;
n++; //lunghezza della stringa
}
s[i]='\0';


BubbleSort_string(&s,n);


// visualizzo i caratteri in ordine alfabetico
for (i=0;i<n;i++){
printf(" %c ",s[i]);
}



return 0;
}

void BubbleSort_string(char **s,int n){

int i=0,flag;
int temp;

do {

flag=0;
for (i=0;i<n-1;i++){
if (*s[i]>*s[i+1]){
temp=*s[i];
*s[i]=*s[i+1];
*s[i+1]=temp;
flag=1;
}
}
}
while (flag==1);
}



/* messaggio del compilatore

warning: passing argument 1 of ‘BubbleSort_string’ from incompatible pointer type

*/

in Generale se voglio scambiare i caratteri di una stringa o muovere i caratteri da una posizione all'altra devo sempre utilizzare il doppio puntatore?

XBarboX
02-01-2010, 21:17
ma perchè usi i puntatori? non puoi semplicemente scrivere s[i] ???

bianchi88
03-01-2010, 00:32
ho pensato e provato ad implementare senza i puntatori, ma ho visto che lo scambio non avviene, avevo letto da qualche parte che per muovere le stringhe dalla memoria occorre usare il doppio puntatore,altro esempio:http://www.c.happycodings.com/Sorting_Searching/code6.html
Siccome il concetto del "doppio puntarore" non è che ho capito ancora bene ho provato ad implentare un esercizio che muovesse i caratteri nella memoria.
Lo scopo dell'esercizio è appunto capire bene come e quando usare il doppio puntatore.

Kej
03-01-2010, 00:50
Beh tieni conto che il tipo char è come un int, quindi ti basta un singolo puntatore.

oregon
03-01-2010, 12:03
Non è assolutamente necessario utilizzare un doppio puntatore ...

Ma devi cominciare a rivedere il codice che hai scritto perchè presenta errori importanti per il resto del funzionamento

1) la variabile i non è inizializzata prima dell'uso

2) la riga

while ((c=getchar()!='\n')){

non è corretta

Loading