[C] domanda sulle funzioni e stringhe

luca981
ciao .
mi date un ochiata al programma che ho fatto ?
che non mi funziona .
// esempio di passaggio di parametri (di caratteri char)

#include<stdio.h>
#define MAX_SIZE 30

main()
{
    char stringa1[MAX_SIZE];

    funzione(3, stringa1);                                     // associato per ordine non per il nome (parametri attuali)
    printf("Stringa letta da file: %s\n", stringa1);
}

//-----------------------------------------------------------------

void funzione(int numero, char stringa[])                      // associato per ordine non per il nome (parametri formali)
{
char stringa2[MAX_SIZE] = "Questa e una stringa \n";           // stringa letta da dove cavolo vuoi (tipo letta da file) 
int i = 0;                                                     // i = contatore
   while ((stringa[i++] = fgetc(stringa2)) != '\n');
   stringa[i] = '\0';
   return;
}

in pratica la funzione deve passare una stringa al programma
/*
int scanf(const char *format, ...);
int fscanf(FILE *stream, const char *format, ...);
int sscanf(const char *str, const char *format, ...);
/*


non devo usare fgetc ?
cosa c'e che non va ?
grazie

Risposte
apatriarca
Qual'è esattamente il testo dell'esercizio?

Ci sono tantissimi problemi nel codice che hai postato.

main()

Nella vecchia versione del C era permesso non scrivere il tipo di ritorno di una funzione, che era int di default. Non è però più permesso nell'ultimo standard e in C++ e quindi ti consiglio di scrivere
int main()


funzione(3, stringa1);                                     // associato per ordine non per il nome (parametri attuali)

Stai lavorando in C++? Nel vecchio standard del C questo genere di commenti non è accettato ed è sfortunatamente lo standard più supportato del linguaggio. In C è quindi meglio usare i commenti nella forma /**/.

void funzione(int numero, char stringa[])                      // associato per ordine non per il nome (parametri formali)

A cosa serve numero? Non lo usi nella funzione...

char stringa2[MAX_SIZE] = "Questa e una stringa \n";           // stringa letta da dove cavolo vuoi (tipo letta da file)

Non capisco il senso di questa stringa.

while ((stringa[i++] = fgetc(stringa2)) != '\n');

Cerca di scrivere il codice nel modo più comprensibile possibile visto che stai imparando. In questa riga di codice hai messo una quantità enorme di operazioni che è meglio mettere in righe separate. Inoltre fgetc NON legge i caratteri da una stringa ma da file. Perché hai quindi passato stringa2 come argomento alla funzione?! Che cosa dovrebbe fare secondo il testo dell'esercizio questa funzione?

return;

Il return in una funzione void non serve, avresti invece dovuto mettere "return 0;" nel main (a meno di lavorare in C++).

luca981
si in realta il programma lo fatto con il c e non con il c++
perche per compilare uso il GCC, (the GNU Compiler Collection) dalla shell con ubuntu .

in realta non conosco nessun programma gratuito di compilazione in c++ per windows

praticamente mi serve un programma di esempio .
voglio fare una funzione che mi restituisca una stringa !

#include<stdio.h>
#define MAX_SIZE 30

main()
{
   char stringa1[MAX_SIZE];

   funzione(3, stringa1);                                     // associato per ordine non per il nome (parametri attuali)
   printf("Stringa letta da file: %s\n", stringa1);
}

void funzione(int numero, char *stringa)                      // associato per ordine non per il nome (parametri formali)
{
char stringa2[MAX_SIZE] = "Questa e una stringa \n";           // stringa letta da dove cavolo vuoi (tipo letta da file)
int i = 0;                                                     // i = contatore
  while ((stringa[i++] = fgetc(&stringa2)) != '\n');
  stringa[i] = '\0';
}


il while mi serve per associare la variabile al puntatore.
Poi il programma lo completo , creo una variabile
da una riga di un file . O da qualsiasi parte .
la funzione me la restituisce al programma principale il main

il programma originale non prevedeva fgetc ma getchar() e
leggeva l'input direttamente dallo stdin (standard input)
ma con fgetc non funziona corettamente.

secondo te non si fa cosi ??
mi dai alcuni consigli come si puo fare
grazie luca

apatriarca
getchar è quasi del tutto equivalente a fgetc(stdin). Se sostituisci uno all'altro dovrebbe funzionare senza problemi anche se non ha particolare senso. Inoltre puoi più semplicemente ancora usare la funzione fgets che legge una riga di testo da file. La seguente legge una riga di testo da console di dimensione al massimo MAX_SIZE e la scrive in stringa:
fgets(stringa, MAX_SIZE, stdin);

Sostituisce quindi del tutto il tuo ciclo (che non controlla la dimensione della stringa letta e quindi potrebbe portare ad un crash del programma.

Visual C++ Express è gratuito su Windows.

luca981
in pratica questo esempio sarebbe piu esplicativo !!

#include<stdio.h>
#define MAX_SIZE 30

void funzione(char *stringa1, char *stringa)               // associato per ordine non per il nome (parametri formali)
{
char stringa2[MAX_SIZE] = "ciao mario \n";                 // stringa letta da dove cavolo vuoi (tipo letta da file) in uscita sarebbe

int i = 0;                                                 // i = contatore
  while ((stringa[i++] = getchar()) != '\n');              // devo associare alla stringa2 al psto di getchar()
  stringa[i] = '\0';

}

main()
{
   char stringa1[MAX_SIZE];
   char stringa2[MAX_SIZE] = "ciao \n";                    // stringa in entrata input (tipo da standard input)
   funzione(stringa2, stringa1);                           // associato per ordine non per il nome (parametri attuali)
   printf("Stringa letta da file: %s\n", stringa1);
}

praticamente non so assocare la variabile stringa2 al puntatore in uscita *stringa della funzione
grazie

apatriarca
Che intendi con associare? Se intendi la copia (la stringa contenuto in un array è uguale a quello del secondo) allora è sufficiente qualcosa come:
for (i = 0; stringa2[i] != '\0'; ++i) {
    stringa[i] = stringa2[i];
}

oppure usare strcpy (o funzioni simili).

Ma il tuo codice non ha molto senso. Il parametro stringa1 non viene usato e neanche l'array locale stringa2 (in entrambe le funzioni). Non credo che associare sia il termine corretto per quello che vuoi fare. Stai forse parlando di assegnamento?

luca981
grazie per la risposta !
era proprio quello che cercavo !
anche se mi sono spiegato male .

io intendevo proprio la copia .
il parametro stringa1 e stringa2 non le ho usate .

il programma che ho fatto era solo un esempio per capire come si faceva la copia
ciao luca

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.