Go Down

Topic: inserire contenuto variabili in una stringa (Read 1 time) previous topic - next topic

skosso

salve...

ho un piccolo problema con il mio progetto...

vi spiego brevemente...

il programma manda un sms con all'interno alcune informazioni... la classe accetta solo questo  es:

sms.SendSMS(char *number_str, char *message_str);

quindi   sms.SendSMS(n, "testo") dove n è il numero di telefono, e poi un testo... oppure una variabile con all'interno un testo intero

non è possibile inviare il valore di una variabile assieme al testo...


ho pensato...

è possibile inserire in una variabile char i valori delle mie variabili numeriche?

es:

int temperatura = 10;
char testo = "la temperatura è di C° " temperatura;

quale è la sintassi corretta?

grz

mancio

Code: [Select]


int number = 20;
char numstr[2]; // la stringa contenente i numeri da inviare
sprintf(numstr, "%d", number); //ti converte i numeri in una stringa
result = name + numstr; //ti concatena due stringhe


skosso

#2
Jan 18, 2013, 01:52 pm Last Edit: Jan 18, 2013, 02:07 pm by skosso Reason: 1
grazie mancio...

ok ora è chiaro...

solo una piccola precisazione potresti spiegarmi in parole spicciole la riga 3? cosa serve "%d"?

un ultima precisazione... il risultato mi servirebbe in char.... come lo converto in char....? se non sbaglio c'è un metodo..ma nn ricordo quale..
grazi

%s, %d, %lu ecc si chiamano string format http://it.wikipedia.org/wiki/Printf

Il più non può essere usate per concatenare due puntatori a char, per farlo si usa una funzione della libreria standard C.

Vedi strcat, strncat.

Ciao.

AvrDudeQui front end per avrdude https://gitorious.org/avrdudequi/pages/Home

tuxduino


Code: [Select]


int number = 20;
char numstr[2]; // la stringa contenente i numeri da inviare
sprintf(numstr, "%d", number); //ti converte i numeri in una stringa
result = name + numstr; //ti concatena due stringhe




Occhio che devi sempre lasciare spazio per il carattere NULL (0x00) alla fine della stringa. Stampanto il numero 20 su un buffer di 2 byte vai a sovrascrivere l'ultima posizione, eliminando il terminatore di stringa.
Devi dichiarare numstr con dimensione di 3 o più byte.

tuxduino

Code: [Select]

const byte SHORT_BUF_LEN = 3;
char tooShortBuf[SHORT_BUF_LEN];

const byte BUF2_LEN = 5;
char buf2[BUF2_LEN];


void fillBuf(char* buffer, byte buflen, char fillChar) {
    for (byte i = 0; i < buflen; i++) {
        buffer[i] = fillChar;
    }
}


void hexdumpString(char* buffer, byte buflen) {
    for (byte i = 0; i < buflen; i++) {
        Serial.print(i);
        Serial.print(": ");
        Serial.println(buffer[i], HEX);
    }
}


void setup() {
    Serial.begin(115200);

    fillBuf(buf2, BUF2_LEN, '#');

    Serial.println("buf2 before:");
    Serial.println(buf2);
    hexdumpString(buf2, BUF2_LEN);

    sprintf(tooShortBuf, "%d", 1000);    // <<<<===== (A)

    Serial.println("tooShortBuf after:");
    hexdumpString(tooShortBuf, SHORT_BUF_LEN);
   
    Serial.println("buf2 after:");
    Serial.println(buf2);
    hexdumpString(buf2, BUF2_LEN);
}


void loop() {
}


Risultato:

Code: [Select]

buf2 before:
#####
0: 23
1: 23
2: 23
3: 23
4: 23
tooShortBuf after:
0: 31
1: 30
2: 30
buf2 after:
0
0: 30
1: 0
2: 23
3: 23
4: 23



I due buffer sono dichiarati di seguito, quindi le loro locazioni di memoria sono adiacenti. Dopo l'ultimo byte allocato per tooShortBuf si trova immediatamente il primo byte allocato per buf2.

La linea contrassegnata con (A) scrive i caratteri '1', '0', '0' .'0', 0x00 a partire dal primo byte allocato per tooShortBuf, ma poiché tale stringa è stata dichiarata di soli 3 byte, gli ultimi due finiscono in realtà "dentro" buf2.
Lo script evidenzia questa "invasione di campo" grazi all'inizializzazione di buf2 con caratteri tutti uguali. Dopo la sprintf su buf2, i primi due sono cambiati.

Go Up