Pages: [1]   Go Down
Author Topic: inserire contenuto variabili in una stringa  (Read 1283 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Jr. Member
**
Karma: 0
Posts: 87
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Fidenza (PR)
Offline Offline
Full Member
***
Karma: 3
Posts: 143
Arduino rocks
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Code:

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

Logged

Offline Offline
Jr. Member
**
Karma: 0
Posts: 87
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
« Last Edit: January 18, 2013, 08:07:33 am by skosso » Logged

0
Offline Offline
Faraday Member
**
Karma: 31
Posts: 2908
Arduino rocks
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

%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.

Logged

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

Offline Offline
Edison Member
*
Karma: 26
Posts: 1339
You do some programming to solve a problem, and some to solve it in a particular language. (CC2)
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Code:

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.
Logged

Offline Offline
Edison Member
*
Karma: 26
Posts: 1339
You do some programming to solve a problem, and some to solve it in a particular language. (CC2)
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Code:
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:
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.
Logged

Pages: [1]   Go Up
Jump to: