[RISOLTO] Stringhe di caratteri in C

di il
10 risposte

[RISOLTO] Stringhe di caratteri in C

Salve a tutti!
E' la prima volta che uso variabili char, e nonostante mi sia letta molti appunti su internet c'è ancora qualcosa che mi sfugge. So che è possibile riempire una stringa leggendo i caratteri da tastiera, mentre non riesco a capire se è possibile farlo assegnandole caratteri all'interno del programma.
Il mio intento è plottare su Gnuplot una funzione e le sue approssimazioni tramite il metodo di Lagrange, ma non riesco a scrivere sul file dei comandi per Gnuplot la funzione esatta (non approssimata)

Ecco la funzione che ho provato a scrivere:
void plot(int n){
	int i;
	double x1,x2,y1,y2;
	char F[40];
	FILE* file1;
	
//assegno all'array i caratteri della funzione che ho scelto all'inizio del programma
	if(n==1) F[40]="exp(x)\0";
	if(n==2) F[40]="cos(x)\0";
	if(n==3) F[40]="sin(3*x)\0";
	if(n==4) F[40]="log(1+x)\0";
	if(n==5) F[40]="1./(1+x*x)\0";
	if(n==6) F[40]="(1-x*x)*(1-x*x)\0";
	if(n==7) F[40]="x*x*x*x*x+3*x*x*x*x+2*x*x*x-x*x-5*x+1\0";
	if(n==8) F[40]="exp(-x*x)\0";
	if(n==9) F[40]="fabs(x)\0";
	if(n==10) F[40]="sin(x*x)\0";
	
//scelgo la porzione di grafico e scrivo su file i comandi (Linux) 
	file1=fopen("comandi.txt","w");
	
	printf("\n\nScegli la porzione di grafico che vuoi vedere");
	do {
		printf("\n\nIntervallo sulle x");
		printf("\nx1: ");
		scanf("%lf",&x1);
		printf("\nx2: ");
		scanf("%lf",&x2);
	} while(x1>x2);
	
	do {
		printf("\n\nIntervallo sulle y");
		printf("\ny1: ");
		scanf("%lf",&y1);
		printf("\ny2: ");
		scanf("%lf",&y2);
	} while (y1>y2);
	
	fprintf(file1,"set yrange [%lf:%lf]\n",y1,y2);
	fprintf(file1,"plot \"polinomio.txt\" with lines\n");
	fprintf(file1,"plot \"lineare.txt\" with lines\n");
	fprintf(file1,"plot \"quadratica.txt\" with lines\n");
	fprintf(file1,"plot %s",F[40]);
	fclose(file1);
	
//chiamo gnuplot
	system("gnuplot comandi.txt -persist");

	return;
}

consigli?

AGGIUNTA: compilando mi dà questo errore

[Error] invalid conversion from 'const char*' to 'char' [-fpermissive]

10 Risposte

  • Re: [RISOLTO] Stringhe di caratteri in C

    Ciao, il problema è che F è un array di char, ovvero di caratteri, mentre tu con l'istruzione
    
    F[40] = 'exp(x)\0';
    
    cerchi di mettere un'intera stringa. Quello che dovresti fare, invece, è di "distribuire" i vari caratteri nelle varie posizioni dell'array.
    Mi spiego meglio: se vuoi inserire la string "exp(x)\0" nell'array F dovresti fare una cosa del tipo:
    
    F[0] = 'e';
    F[1] = 'x';
    F[2] = 'p';
    ...
    F[6] = '\0';
    
    Esiste una funzione che fa esattamente questa cosa: strncpy (chè è più sicura della sua "controparte non controllata" strcpy).
  • Re: [RISOLTO] Stringhe di caratteri in C

    Utilizza la funzione strcpy così

    strcpy(F, "exp(x)");
  • Re: [RISOLTO] Stringhe di caratteri in C

    Ahhh capito! Grazie mille ad entrambi, vado subito a correggere
  • Re: [RISOLTO] Stringhe di caratteri in C

    Comunque occhio con la strcpy perché se passi una stringa più lunga dell'array vai a sporcare della memoria, con risultati che possono andare da un crash (nel caso migliore) a cose impredicibili (es: potresti cambiare involontariamente il valore di una o più varibili ed il programma avrebbe un comportamento non previsto). Quindi il consiglio è di aumentare la dimensione di F ad un valore sufficientemente alto oppure di usare, come detto prima, la strncpy in questo modo:
    
    strncpy(F, <stringa>, 39); // copio al max 39 caratteri
    F[39] = '\0'; // per evitare l'overflow in fase di lettura
    
    In questo modo ti copia <stringa> dentro ad F fino ad un massimo di 39 caratteri (se <stringa> è più corto di 39 non c'è problema, altrimenti la parte che eccede i 39 caratteri viene ignorata).
  • Re: [RISOLTO] Stringhe di caratteri in C

    Ma il \0 è essenziale? perché copiando su file la stringa quello diventa un carattere sconosciuto per gnuplot e non mi disegna nulla
  • Re: [RISOLTO] Stringhe di caratteri in C

    Per l'uso che ne deve fare (ovvero per delle costanti stringa da copiare in un buffer abbastanza grande) la strcpy è sicura.
  • Re: [RISOLTO] Stringhe di caratteri in C

    @oregon: ho scritto quel messaggio proprio perché ho visto che una delle stringhe aveva una lunghezza al limite (39 caratteri incluso il null finale)

    @Lallolla: Il '\0' è il carattere che C usa per indicare che si è raggiunta la fine di una stringa, per cui è una convenzione interna al C. Sinceramente non conosco GNUPlot, quindi non ti saprei dire se lo vuole oppure no, dovresti leggere la relativa documentazione
    EDIT: ho visto ora che le stringhe le stampi su file: in questo caso se non sbaglio il carattere '\0' non dovrebbe essere stampato nel file, ma deve comunque essere presente nel codice C, altrimenti il programma non è in grado di sapere quando finisce la stringa e andrebbe avanti a scrivere il contenuto della memoria finché non incontra un '\0'
  • Re: [RISOLTO] Stringhe di caratteri in C

    Della ha scritto:


    @oregon: ho scritto quel messaggio proprio perché ho visto che una delle stringhe aveva una lunghezza al limite (39 caratteri incluso il null finale)
    Ok ... ma questo fatto è generale, ovvero vale anche per la strncpy ... Volevo fare passare il messaggio che la pericolosità di alcune funzioni o di altre funzioni è legata a quello che si scrive nel codice ...
  • Re: [RISOLTO] Stringhe di caratteri in C

    Sì, sicuramente anche con la strncpy si possono fare danni, ma si ha un pochino più di controllo.

    oregon ha scritto:


    Volevo fare passare il messaggio che la pericolosità di alcune funzioni o di altre funzioni è legata a quello che si scrive nel codice ...
    Senza ombra di dubbio
  • Re: [RISOLTO] Stringhe di caratteri in C

    A questo punto è meglio consigliare di scrivere
    
    	char *F[] = {
    				 "exp(x)", 
    				 "cos(x)",
    				 "x*x*x*x*x+3*x*x*x*x+2*x*x*x-x*x-5*x+1"
    			    };
    
    e usare n come indice ...

    Ciao
Devi accedere o registrarti per scrivere nel forum
10 risposte