2013-06-16 1 views
18

Quando sto passando una stringa alla funzione A volte usoPassare una stringa a una funzione in C - con o senza puntatori?

char *functionname(char *string name[256]) 

e qualche volta utilizzarlo senza puntatori (ad esempio:

char functionname(char string[256]) 

La mia domanda è, quando ho bisogno di usare puntatori? Spesso scrivo i programmi senza puntatori e funziona, ma a volte non è così.

+1

Cosa fare intendi con "a volte funziona, ea volte no"? – Anickyan

+6

Hai bisogno di leggere un tutorial di base amico mio. – Maroun

+1

Per favore non farci indovinare. Mostra il tuo codice. Basta per noi per capire il problema. –

risposta

29

La convenzione accettato di passare C-stringhe a funzioni è quello di utilizzare un puntatore:

void function(char* name) 

Quando la funzione modifica la stringa si dovrebbe passare anche nella lunghezza:

void function(char* name, size_t name_length) 

Il tuo primo esempio:

char *functionname(char *string name[256]) 

passa una serie di puntatori a stringhe che non è quello che è necessario in tutti.

Il secondo esempio:

char functionname(char string[256]) 

passa un array di caratteri. La dimensione della matrice qui non ha importanza e il parametro decadrà a un puntatore comunque, quindi questo è equivalente a:

char functionname(char *string) 

Vedi anche this question per maggiori dettagli su argomenti di matrice in C.

+0

C'è qualche danno se la funzione riceve la stringa nel modo seguente: char functionname (char string [256]) –

+0

'void function (char * name) 'è quindi applicabile solo quando non modifica la C-string? Non avrebbe senso dichiararlo 'const'? Come per la maggior parte, stai inviando un puntatore che dovrebbe essere anche const, dal momento che non cambierai il puntatore stesso? – Paul

+0

'char * functionname (char * nome stringa [256])' è un errore di sintassi, non "passa un array di puntatori". –

0

un array è un puntatore. essa indica l'inizio di una sequenza di "oggetti".

Se facciamo questo: ìnt arr[10];, quindi arr è un puntatore a una posizione di memoria, da cui seguono dieci interi. Non sono inizializzati, ma la memoria è allocata. È esattamente come fare int *arr = new int[10];.

+0

#include #include vuoto StringSort (char S [5] [30 ]); void main() { \t char S [5] [30]; \t int i; \t printf ("Unesi 5 stringova: \ n"); \t per (i = 0; i <5; i ++) \t \t ottiene (S [i]); \t printf ("\ nUneseni stringovi su: \ n"); \t per (i = 0; i <5; i ++) \t \t puts (S [i]); \t StringSort (S); \t printf ("\ nStringovi sortirani po broju znakova su: \ n"); \t per (i = 0; i <5; i ++) \t \t puts (S [i]); } vuoto StringSort (char S [5] [30]) { \t char pS [30]; \t int i, j; \t for (i = 0; i <4; i ++) \t \t for (j = i + 1; j <5; j ++) \t \t \t if (strlen (S [i])> strlen (S [ j])) \t \t \t { \t \t \t \t strcpy (pS, S [i]); \t \t \t \t strcpy (S [i], S [j]); \t \t \t \t strcpy (S [j], pS); \t \t \t} –

+2

Un array è * non * un puntatore. per esempio, 'sizeof (arr)' è diverso per un array e un puntatore. E 'new' è C++, non C. – interjay

+0

@interjay, mi spiace. Non ci ho pensato. Ovviamente puoi usare malloc(). – Anickyan

1

Supponendo che si intende scrivere

char *functionname(char *string[256]) 

Qui si dichiara una funzione che accetta un array di 256 puntatori a char come argomento e restituisce un puntatore a char. Qui, invece,

char functionname(char string[256]) 

si dichiara una funzione che accetta un array di 256 char s come argomento e restituisce un char.

In altre parole, la prima funzione accetta una serie di stringhe e restituisce una stringa, mentre la seconda accetta una stringa e restituisce un carattere.