[C] Funzioni char

luca981
prendendo in esame questo programma ....... che non funziona .
#include<stdio.h>
#define MAX_SIZE 200
main(void)
{
   char riga[MAX_SIZE];                   // stringa esterna
   char parola[20];                       // prima parola esterna
   char parola1[20];                      // seconda parola  esterna
   printf("prova funzione stringa  \n");     
   {
      fgets(riga, MAX_SIZE, stdin);
      sscanf(riga, "%s %s", parola, parola1);
      printf("la prima parola che hai scritto nella frase e: %s\n", parola); 
      printf(">>%d\n", ricerca (parola));            /* un dato in uscita e uno in entrata */
      printf("................................\n");     
   }
}

int ricerca (char parola)           /* uno in entrata  */
{
char risposta[] = "Questa e una stringa \n";          /* un dato in uscita */ 
return risposta ;                       /* un dato in uscita */
}


come faccio ha far passare come argomento di uscita della funzione ricerca una variabile tipo char e non int ??
e facile con i numeri interi ,, ma con i caratteri ?

un altra domanda .......
quando vado a compilare dalla linea di comando terminale
c'è un istruzzione al compilatore per saltare i warning?


grazzie per le risposte !
provate ....
luca ciao

Risposte
BoG3
beh quando fai return X;, al posto della x metti quello che ti interessa (come ad esempio un puntatore ad una stringa/char/ogetto...) poi quando la richiami dovrai assegnarla ad una variabile... adesempio, supponiamo che tu restituisca un puntatore in memoria ad una stringa (o array di caratteri)
dovrai fare:

int *puntatore_stringa = ricerca(parametri);


per la domanda del warming: dipende dal compilatore.

dopo 1 occhiata veloce, nel tuo esempio usi dei vettori di carattere, che vengono trattati come puntatori ... ma non è importante... potresti semplicemente fare:

char risultato_ricerca[20] = ricerca(xxx);

luca981
In C le stringhe non esistono, e non esistono gli array multidimensionali

Il comando (int *) simboleggia un pointer integer. La
condizzione per gestire quel tipo di puntatori e' molto importante per
garantire che i puntatori aritmetici vengano rappresentati correttamente.

secondo le più rigorose "coding guides" è opportuno evitare funzioni che restituiscono tipi diversi da int e booleani: a maggior ragione se si utilizza un "cross-compiler".
Per altri tipi, nativi e custom, è opportuno manipolare dei puntatori passati come parametri. capito ?

Per questo motivo non vi sono nelle librerie molte funzioni che restituiscono una "stringa".

La soluzione più standard e performante è quella di passare un puntatore a char alla funzione che deve restituire la stringa:
#include<stdio.h>
#define MAX_SIZE 25

void getPersona(int i, char *p)
{
char stringa[] = "Questa e una stringa \n";
char strcpy(stringa, p); 
return i, stringa;
}

int main()
{
    char *p;
    char buffer[128];

 p = (char *)malloc(MAX_SIZE);
    getPersona(3, p);
    printf("Stringa letta da file: %s\n", p);
}

mi sa tanto che dovro ripassare i puntatori a vettori !!!
e chi sa cosa altro ..
ciao grazzie

apatriarca
Hai commesso tre errori nella tua funzione: il primo è l'inserimento di char davanti a strcpy che credo sia una svista, il secondo è invece l'uso sbagliato del return, il terzo è l'uso sbagliato di strcpy. L'istruzione return serve per restituire un valore dalla funzione come valore di ritorno, se però "restituisci" dei valori attraverso i parametri allora non devi usare return. strcpy vuole prima la stringa di destinazione e poi quella di partenza.

#include<stdio.h>
#include <string.h>
#include <stdlib.h>
#define MAX_SIZE 25

void getPersona(char *p)
{
char stringa[] = "Questa e una stringa \n";
strcpy(p, stringa);
}

int main()
{
    char *p;

    p = (char *)malloc(MAX_SIZE);
    getPersona(p);
    printf("Stringa letta da file: %s\n", p);
}

luca981
ma devo per forza usare strcpy e mallocper puntare le variabili ??

apatriarca
No, nel tuo codice usavi quelle funzioni e quindi le ho usate nel codice corretto... Cosa stai cercando di fare esattamente?

luca981
praticamente sto cercando di fare un esempio base che riassuma il funzionamento dei puntatori
senza usare altre funzioni .
strcpy e malloc non sono funzioni difficili .
ma mi piace l'idea di usare i puntatori senza altre funzioni

tipo
char *p[25] = "Questa e una stringa \n";

due chiachere con il messanger mi aiuterebbereo ha esaurire le mie curiosita .
gentimente grazzie

apatriarca
L'uso di malloc, o di funzioni simili fornite da altre librerie, è necessario per utilizzare l'allocazione dinamica della memoria. Se non vuoi usare l'allocazione dinamica devi usare degli array di dimensione fissa conosciuta durante la compilazione.

Un esempio semplice che riassume l'uso dei puntatori può essere la scrittura di una funzione che gestisce le stringhe. Per esempio la riscrittura di una delle funzioni di string.h (anche con qualche variante).
Per esempio il seguente codice copia una stringa in un altra di dimensione al massimo size e restituisce come risultato la lunghezza della nuova stringa:

int copy_string(char *dest, int size, char *src)
{
    int i;

    for (i = 0; i < (size - 1) && src[i] != '\0'; ++i) {
        dest[i] = src[i];
    }
    dest[i] = '\0';

    return i;
}


Manca il controllo degli errori ma per il resto dovrebbe essere abbastanza corretta. Ho cercato di scrivere il codice nel modo più chiaro possibile (quindi ad esempio usando l'operatore [] invece che l'aritmetica dei puntatori). Se vuoi puoi provare a riscriverla tu in modo da usare solo l'aritmetica dei puntatori. Oppure puoi provare ad implementare un'altra funzione.

La tua dichiarazione non è valida... Scrivi
const char *p = "Questa e una stringa \n";
oppure
char p[25] = "Questa e una stringa \n";

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