2010-04-13 23 views
6

Ho visto un sacco di domande su StackOverflow, ma leggere le risposte non lo ha chiarito, probabilmente perché sono un newbie totale nella programmazione in C. Ecco il codice:Restituisce un puntatore a un array di caratteri in C

#include <stdio.h> 

char* squeeze(char s[], char c); 

main() 
{ 
    printf("%s", squeeze("hello", 'o')); 
} 

char* squeeze(char s[], char c) 
{ 
    int i, j; 

    for(i = j = 0; s[i] != '\0'; i++) 
    if(s[i] != c) 
     s[j++] = s[i]; 
    s[j] = '\0'; 

    return s; 
} 

Compilare e ottengo un errore di segmentazione quando lo eseguo. Ho letto this faq su come restituire gli array e ho provato la tecnica "statica" suggerita da lì, ma ancora non riuscivo a far funzionare il programma. Qualcuno potrebbe indicare esattamente cosa c'è che non va e cosa dovrei prestare attenzione in futuro?

+2

Che cosa stai cercando di fare? –

+0

@snitko: dov'è il tipo di ritorno di 'main()'? –

risposta

6

Il primo argomento passato alla funzione squeeze è una stringa read-only letterale "hello", che si sta tentando di modificare.

Invece passaggio un array di caratteri modificabile:

char str[] = "hello"; 
printf("%s", squeeze(str, 'o')); 
+1

Si potrebbe anche invocare il principio di minima sorpresa per suggerire di fare una copia della stringa, invece. Se sto passando un char * in una funzione che restituisce char *, non mi aspetto che modifichi l'array sul posto. (I progettisti di API sono spesso sciatti se usano _const_.) –

3

Il problema è rappresentato dal fatto che la costante dell'array "hello"non può essere modificata correttamente dalla funzione a cui è stata passata. Quindi, basta assicurarsi che si sta passando una matrice non costante (ad esempio facendo una matrice locale da passare, fino a quando il risultato non è necessaria al di fuori del chiamante squeeze s'):

int main() 
{ 
    char xxx[] = "hello"; 
    printf("%s", squeeze(xxx, 'o')); 

    return 0; 
} 

È Prevedo che una tale costante possa essere passata a un argomento const (in modo che il compilatore stesso possa dirti cosa stai facendo male), ma, ahimè, non è quello che lo standard C richiede (presumibilmente per ragioni di retrocompatibilità con codice storico).

+1

Non c'è niente di temporaneo, la stringa è memorizzata nella memoria "statica". –

+0

Buon punto (e formulando una mia parte, lasciatemi riformulare). –

3

Questo sta tentando di modificare i dati non modificabili.

"ciao" è una stringa costante, memorizzata in qualche luogo. Quello che stai cercando di fare, quindi, è cambiarlo, e generalmente non è permesso. Non vedo cosa intendi per "statico", ma quello che vuoi è qualcosa di simile ...

int main() 
{ 
    char hello_str[16]; 
    strcpy(hello_str, "hello"); 
    printf("%s", squeeze(hello_str, 'o')); 
} 
Problemi correlati