Newsgroup: it.comp.lang.c
Titolo: [newbie,nonuccidetemi] Problema con char e stringhe...

Salve gente!
E' la prima volta che posto su questo ng, quindi non uccidetemi se dico 
cavolate...
Nel mio codice devo elaborare dei dati e poi scriverli in un'array of 
char  (writetolcd nel mio caso).
Devo impostare "writetolcd"  a  "@C@Y01@X01" , aggiungerci i primi 16 
caratteri di un'altra stringa e poi attaccarci alla fine i 2 caratteri 
"@A". Alla fine scrivo tutto in un device.
La stringa viene elaborata in un loop (in pratica cerco tutti i files di 
una cartella, metto i primi 16 caratteri del nome file a sandwitch e lo 
scrivo su un device giï¿œ aperto a monte del programma):
DIR *dir;
struct dirent *ent;
string path;
char writetolcd[64];
dir = opendir ("/hddext/filesharing/");
if (dir != NULL) {
   while ((ent = readdir (dir)) != NULL) {
     printf ("%s\n", ent->d_name); //stampo a video il nome del file/dir
     path = ent->d_name;
....qui non riesco a capire quale cavolo di istruzioni usare....
     write(fd,writetolcd,28);
   }
   closedir (dir);
Il problema ï¿œ che non riesco a capire come mettere in writelcd il 
risultato di questa espressione:
writetolcd="@C@Y01@X01" + primi 16 caratteri di "path" + "@A"
essendo "path" una stringa e writetolcd una stringa.
Le ho provate tutte le funzioni, ma ottengo sempre errori di 
incompatibilitï¿œ stringa/char (ho provato strcpy,substr,etc...)
Esiste una cosa semplice per scrivere quella diavolo di riga che mi 
manca? (credo si faccia in una sola riga di codice, almeno spero!)
Sono alle prime armi con c/c++...provengo da Delphi e devo buttarmi sul 
c/c++ per programmare una board embedded....non uccidetemi per la 
banalitï¿œ della domanda.

 cavolate...
 > [...]
Non vorrei dire io una cavolata, ma il tipo string in C non l'ho mai visto!!

 (ho provato strcpy,substr,etc...)
Sempre da string.h io userei strncpy per copiare i 16 caratteri che ti 
interessano.
Devi controllare la lunghezza altrimenti strncpy ti riempie gli spazi 
mancanti con '\0' terminandoti la stringa prima di "@A".
strncpy(writetolcd, "@C@Y01@X01", 10);
strncpy(writetolcd+10, path, 16);
strncpy(writetolcd+10+strlen(path),"@A", 3);


Non funge...sbaglio qualcosa...
questo è il mio codice:
DIR *dir;
                 struct dirent *ent;
                 string path;
                 dir = opendir ("/hddext/filesharing/amule/Incoming");
                 if (dir != NULL) {
                     while ((ent = readdir (dir)) != NULL) {
                     printf ("%s\n", ent->d_name);
                     path = ent->d_name;
                     strncpy(writetolcd, "@C@Y01@X01", 10);
                     strncpy(writetolcd+10, path, 16);
                     strncpy(writetolcd+10+strlen(path),"@A", 3);
                 }
e questo l'errore:
main.cc:58: error: cannot convert 'std::string' to 'const char*' for 
argument '2' to 'char* strncpy(char*, const char*, size_t)'
main.cc:59: error: cannot convert 'std::string' to 'const char*' for 
argument '1' to 'size_t strlen(const char*)'
la riga 58 è questa:
strncpy(writetolcd+10, path, 16);
writetolcd è definito così:
char writetolcd[64];
essendo un'array di char e non una stringa,credo sia quello il problema...

Miglioramenti:
DIR *dir;
                 struct dirent *ent;
                 string path;
                 dir = opendir ("/hddext/filesharing/amule/Incoming");
                 if (dir != NULL) {
                     while ((ent = readdir (dir)) != NULL) {
                     printf ("%s\n", ent->d_name);
                     path = ent->d_name;
                     strncpy(writetolcd, "@C@Y01@X01", 10);
                     path.copy(writetolcd+10,1,16);
                     strncpy(writetolcd+26,"@A", 2);
                     //write(fd,writetolcd,28); //solo di prova!
Ma quando viene eseguita questa:
path.copy(writetolcd+10,1,16);
il programma và in crash!
Suppongo che sia sbagliato l'utilizzo della funzione copy, il mio 
ragionamento (da niubbo) è che copio 16 caratteri (a partire dal primo) 
da "path" nell'array writetolcd a partire dalla posizione 16.
Cosa sbaglio?

 Cosa sbaglio?
Non lo so, non conosco il tipo string di C++, credevo che string fosse 
un tuo typedef per (char *).

 Cosa sbaglio?
Sbagli NG, qui si parla di C.  Prova su it.comp.lang.c++
Ciao
Giovanni
-- 
   A computer is like an air conditioner,
   it stops working when you open Windows.
   < 
http://giovanni.homelinux.net/
 >

> Cosa sbaglio?
Ciao,
sbagli a mischiare il C col C++. Siccome la domanda l'hai posta qui, 
assumo che tu abbia la necessità di scrivere in C, dove il tipo string 
non esiste e per gestire le stringhe si utilizzano array di caratteri 
(char) nei quali si identifica la fine della stringa con un carattere 
teminatore di valore 0 (NULL). Di conseguenza la tua funzione si 
potrebbe scrivere così:
#include <sys/types.h>
#include <dirent.h>
#include <string.h>
#include <malloc.h>
#define DATA_LEN 16
#define DIR_WORK "/usr/bin"
int main(void);
int main()
{
     const char pre[] = "@C@Y01@X01";
     const char post[] = "@A";
     char  *WriteToLCD;
     DIR *dir;
     struct dirent *dentry;
     WriteToLCD = malloc(strlen(pre) + DATA_LEN + strlen(post) + 1);
     if(WriteToLCD == NULL)
     {
         printf("\ncannot allocate memory.\n");
         return;
     }
     if((dir = opendir(DIR_WORK)) == NULL)
     {
         printf("\nerror opening stream directory.\n");
         return;
     }
     while((dentry = readdir(dir)) != NULL)
     {
         strcpy(WriteToLCD, pre);
         strncat(WriteToLCD, dentry->d_name, DATA_LEN);
         strcat(WriteToLCD, post);
         printf("%s\n", WriteToLCD); /* Qui dovresti sostituire la */
                                     			/* printf con la scrittura        */
                                    			/* verso il device. 
    */
     }
     closedir(dir);
     free(WriteToLCD);
     return;
}
Spero ti sia utile.
Un saluto.


Grazie infinite!
Utilissimo (riadattato,funge)