PDA

Visualizza la versione completa : [C]Inizializzare/confrontare variabili char e/o stringhe


Hirakeydos
02-03-2009, 19:29
Salve a tutti, come sicuramente si intuirà dal titolo ho un problema con un listato in C.
Praticamente sto provando a rifare in C (per impararne la sintassi) alcuni programmi fatti a scuola in Pascal e, mentre con quest'ultimo fila tutto liscio, in C il listato mi genera un errore su un ciclo do ... while.



#include <stdio.h>
#include <conio.h>

int somma, max_num, i, somma1, wh;

main(){
do {
printf("Inserire il numero di quadrati da sommare.\n");
scanf("%i",&max_num);

if (max_num <= 0) {
printf("Non e' possibile inserire numeri negativi o zero.\n");
scanf("%i");
}

i = 0;
somma = 0;
do {
somma = (i * i) + somma;
printf(" %d",i);
printf(") La somma e': %d\n",somma);
i++;
} while (i <= max_num);


printf("Continuare? S/N.\n");
scanf("%i",&wh);

} while (wh != 1);
}

Così come lo vedete il listato, una volta compilato, funziona benissimo, ma se invece provo a farlo come era l'originale in Pascal (dove, al posto di dichiarare/leggere wh come un intero, lo dichiaravo e leggevo come stringa) mi genera un errore di questo genere:

29 [Warning] comparison between pointer and integer

questo è il listato che genera l'errore:


#include <stdio.h>
#include <conio.h>

char wh[2];
int somma, max_num, i, somma1;

main(){
do {
printf("Inserire il numero di quadrati da sommare.\n");
scanf("%i",&max_num);

if (max_num <= 0) {
printf("Non e' possibile inserire numeri negativi o zero.\n");
scanf("%i");
}

i = 0;
somma = 0;
do {
somma = (i * i) + somma;
printf(" %d",i);
printf(") La somma e': %d\n",somma);
i++;
} while (i <= max_num);


printf("Continuare? S/N.\n");
scanf("%s",&wh);

} while (wh != "s");
}

Il programmino è relativamente semplice, e non fa altro che prendere un intero in input e calcolarne la somma di tutti i quadrati fino a quell'intero (e questo lo fa); ma ha la pecca di avere questo ciclo do ... while ribelle.
Sono io che non ho capito come leggere/dichiarare le variabili char e string, o sbaglio la sinstassi da qualche parte?
Per il resto, ci sono altri errori di qualsiasi genere? (anche se sono errori di stile, mi interessa anche imparare a scrivere programmi ben formati)


Grazie a tutti anticipatamente.

oregon
02-03-2009, 20:17
In C non puoi confrontare le stringhe con i normali operatori ma devi usare la funzione di libreris

strcmp

(o altre simili). Inoltre considera che per una stringa il nome del vettore rappresenta il puntatore all'inizio della stringa. Quindi dovrai scrivere



scanf("%s", wh);

} while (strcmp(wh, "s") == 0);


Leggi l'help

http://www.cplusplus.com/reference/clibrary/cstring/strcmp.html

e tieni presente che esiste una differenza tra s e S ...

Hirakeydos
03-03-2009, 17:39
Originariamente inviato da oregon
Inoltre considera che per una stringa il nome del vettore rappresenta il puntatore all'inizio della stringa.

Mmmh, se ho capito bene, nel mio caso, wh, preso da solo, rappresenta il puntatore che contiene l'indirizzo del primo blocco di memoria occupato dalla stringa?


Quindi dovrai scrivere
...
...
Leggi l'help

http://www.cplusplus.com/reference/clibrary/cstring/strcmp.html

Una domanda su questo manuale: cliccando su una libreria, nella colonna sotto riporta tutte le funzioni di quella libreria? O solo le più importanti?
Per uno come me che è agli inizi mi sembra decisamente utile un manuale del genere.


e tieni presente che esiste una differenza tra s e S ...
Beh si, lo sapevo che il C è case sensitive :P

Grazie per l'aiuto :)

MItaly
03-03-2009, 17:56
Originariamente inviato da Hirakeydos
Mmmh, se ho capito bene, nel mio caso, wh, preso da solo, rappresenta il puntatore che contiene l'indirizzo del primo blocco di memoria occupato dalla stringa?

Una domanda su questo manuale: cliccando su una libreria, nella colonna sotto riporta tutte le funzioni di quella libreria? O solo le più importanti?
Tutte.


Per uno come me che è agli inizi mi sembra decisamente utile un manuale del genere.

Ad uno che è agli inizi serve un manuale cartaceo di apprendimento, più che uno online di riferimento

Hirakeydos
03-03-2009, 20:37
Originariamente inviato da MItaly
Ad uno che è agli inizi serve un manuale cartaceo di apprendimento, più che uno online di riferimento
Concordo in pieno, ma per il momento preferisco aspettare di fare in Pascal anche gli aspetti avanzati della programmazione (Liste, Record, allocazione dinamica e statica della memoria ecc.), per poi passare a farli col C e comprare qualcosa tipo "The C Programming Language", se non è di apprendimento quello... (o non lo è?)

YuYevon
03-03-2009, 21:41
Originariamente inviato da Hirakeydos
per poi passare a farli col C e comprare qualcosa tipo "The C Programming Language", se non è di apprendimento quello... (o non lo è?)

"The C Programming Language" (magari in lungua madre!) è IL libro di C :)

MItaly
03-03-2009, 22:04
In ogni caso fin d'ora ti consiglio piuttosto di imparare il C++: hai la stessa possibilità del C di lavorare a basso livello, ma le classi e i template ti forniscono quell'astrazione indispensabile per programmare agevolmente (un esempio a caso: la classe string).

Hirakeydos
05-03-2009, 12:25
"The C Programming Language" (magari in lungua madre!) è IL libro di C
:D I know :D

Originariamente inviato da MItaly
In ogni caso fin d'ora ti consiglio piuttosto di imparare il C++: hai la stessa possibilità del C di lavorare a basso livello, ma le classi e i template ti forniscono quell'astrazione indispensabile per programmare agevolmente (un esempio a caso: la classe string).

Non vorrei rischiare di aprire un dibattito sull'argomento trito e ritrito di "quale linguaggio di programmazione è meglio per cominciare" (perché dal canto mio sono fermamente convinto che per iniziare il migliore sia il Pascal), però vedi, il C++ è ad oggetti (anche se permette di lavorare in modo modulare) e per questo motivo avevo pensato di passare prima dal C (e impararlo bene) per arrivare poi al C++ (e imparare l'OOP). E' solo una "mappa" (chiamiamola così) che mi sono fatto in testa, nel caso mi sia sbagliato posso sempre cambiare progetti.

shodan
05-03-2009, 12:30
E' come voler imparare l'italiano partendo dal latino. Non fa male ma ci si impiega più tempo.

MacApp
05-03-2009, 14:06
Opinabile, ma penso sia meglio partire dal C.
Quando poi si incominciano a mettere puntatori a funzione in campi di strutture, nel tentativo (non vano) di programmare ad oggetti in C puro... il passaggio al C++ diventa quasi una "liberazione".

Certo il percorso è un po' arduo, ma certamente appagante ;-)

Loading