Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Samsung Micro RGB R95H, il primo LCD a LED rossi, verdi e blu di Samsung alla prova del banco di misura
Samsung Micro RGB R95H, il primo LCD a LED rossi, verdi e blu di Samsung alla prova del banco di misura
Il primo Micro RGB di Samsung per il salotto è il 65 pollici da 2.749 euro. Sul banco di misura abbiamo rilevato 2.000 nit di picco, nero assoluto con il local dimming e il 91,4% del BT.2020, il colore più ampio che abbiamo misurato su un LCD
iPhone 18 Pro: la recensione del miglior iPhone compatto di sempre
iPhone 18 Pro: la recensione del miglior iPhone compatto di sempre
Apple ha rinnovato iPhone 18 Pro soprattutto dentro: chip A20 Pro a 2 nm con memoria affiancata al SoC, camera di vapore tre volte più ampia, Dynamic Island più piccola del 25% grazie a Face ID sotto il display e fotocamera principale con diaframma variabile da f/1.48 a f/4. Lo abbiamo misurato al colorimetro e nei benchmark, usato con iOS 27 e messo alla prova in fotografia tra laghi, borghi e interni poco illuminati
Panasonic, 30 anni di Toughbook: la "Bibbia" di mille regole dietro i nuovi G3 e 34
Panasonic, 30 anni di Toughbook: la "Bibbia" di mille regole dietro i nuovi G3 e 34
A Londra, per il trentennale dei Toughbook, Panasonic ha presentato il tablet G3 e il 2-in-1 34. Con Jon Tucker, a capo dell'ingegneria europea, abbiamo parlato di ciò che non si vede: batterie, antenne, porte seriali e accorgimenti nati sul campo
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 02-02-2007, 18:28   #1
ka0s
Member
 
Iscritto dal: Nov 2005
Messaggi: 151
[C] problemi con stringhe

Allora, nel sorgente dichiaravo e inizializzavo le stringhe così:
Codice:
char* stringa;
(..)
stringa="abcdefg";
Adesso ho bisogno che sia l'utente ad inserire la stringa di volta in volta... e qui nascono i problemi... ho fatto molti tentativi (allocandole con malloc, ecc.) ma alla fine c'è sempre qualche problema (in sostanza non raggiungo lo stesso risultato che raggiungevo con l'esempio sopra...)

Quello che poi si deve fare con la stringa è:
- memorizzarla all'interno di una struct (e sarebbe opportuno che la stringa abbia una lunghezza corretta, dato che allocandola in memoria devo per forza specificare un valore massimo)
- passarla come parametro in una funzione e fare operazioni di confronto con altre stringhe (magari prese da altre struct).

Qualche idea?
__________________
ka0s
ka0s è offline   Rispondi citando il messaggio o parte di esso
Old 02-02-2007, 19:27   #2
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
Attento che un comportamento del genere può portare a degli errori grossolani...

Ad esempio:
Codice:
void foo(char *s)
{
   s = "abcdefgh";
}
La stringa s non conterrà "abcdefgh" dopo la terminazione di foo..."abcdefgh" è una constante stringa, ora non mi ricordo come si comporti il compilatore, cioè se le dichiara globalmente o se siano valide solo all'interno dello scope, ma fatto sta che il valore di s non sarà modificato nel chiamante...
Ricordati che devi sempre allocare lo spazio per le stringhe su cui deve lavorare, ci sono pochi casi in cui ti basta che il puntatore punti alla costante stringa...

Se fai così:

char *s = "abcdefgh";

s punta alla costante stringa, ma non potrai mai utilizzare s per contenere altre stringhe, in quanto è un semplice puntatore.

Quindi ricordati sempre di allocare la memoria necessaria per contenere le stringhe...o in maniera statica:

char s[] = "abcdefgh"; //ti allocherà un char s[9]

o in maniera dinamica:

char *s;
...
s = (char *)malloc(9 * sizeof(char));

strcpy(s, "abcdefgh");

In quest'ultimo modo puoi anche allocare le stringhe per le strutture...
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 02-02-2007, 19:44   #3
ka0s
Member
 
Iscritto dal: Nov 2005
Messaggi: 151
Grazie mille per la spiegazione!!
Per il programma che sto facendo ora non c'è bisogno di modificare le stringhe una volta definitive... l'unica cosa che devo farci è usarle con le strutture e fare eventuali confronti con altre stringhe di altre strutture...

usando strcpy(s, "abcdefgh"); come si fa ad allocarle per le strutture? cioè dopo aver fatto questo la stringa è allocata, ma come gli dico di metterla in un campo della struttura? Ad es. se la struttura fosse una cosa del genere:

Codice:
typedef struct {
   int a,b;
   ecc. ecc.
   char *s;  /* è giusto farla cosi? non credo... dopo come si fa quindi? */
} Struttura;
PS: tenendo conto del fatto che è l'utente che deve inserire la stringa in input, quindi in strcpy(s, "abcdefgh"); al posto di "abcdefgh" ci andrebbe la stringa inserita dall'utente... come faccio a fare questo?
__________________
ka0s
ka0s è offline   Rispondi citando il messaggio o parte di esso
Old 02-02-2007, 20:27   #4
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Messaggi: 5206
Quote:
Originariamente inviato da ka0s
PS: tenendo conto del fatto che è l'utente che deve inserire la stringa in input, quindi in strcpy(s, "abcdefgh"); al posto di "abcdefgh" ci andrebbe la stringa inserita dall'utente... come faccio a fare questo?
Le varie funzioni di lettura da uno stream (es. fgets, fscanf, ecc....) si aspettano di operare su un buffer già allocato e di una certa lunghezza ben precisa e nota. Non c'è, insomma, una funzione "standard" che faccia una cosa del tipo: dammi uno stream che ti leggo una linea di qualunque lunghezza e la alloco in un buffer.

Questo però non vuol dire che non si possa fare. Ecco una semplice funzione che ho appena fatto che fa proprio questo: tu gli passi uno stream (anche stdin, volendo) e la funzione espande man mano il suo buffer di lettura fin quanto è necessario. Alla fine restituisce un puntatore ad una area di memoria grande esattamente (se possibile) quanto basta per la stringa.

Codice:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>


char *read_line_string (FILE *f)
{
    int   block = 256;
    int   capacity = 0, len = 0;
    char *buf = NULL, *p;

    do {
        capacity += block;

        p = (char*) realloc (buf, capacity);

        if (p == NULL)
        {
            free (buf);
            return NULL;
        }

        buf = p;

        fgets (&buf[len], capacity-len, f);

        if ((p = strchr (&buf[len], '\n')) != NULL)
            *p = '\0';

        len += (int) strlen (&buf[len]);
    } while (p == NULL);

    p = (char*) realloc (buf, len+1);

    if (p != NULL)
        buf = p;

    return buf;
}
Spero possa essere utile.
__________________
Andrea, Senior Java developer – SCJP 5 (91%) • SCWCD 5 (94%)
Java Versions Cheat Sheet

Ultima modifica di andbin : 03-02-2007 alle 09:50.
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 03-02-2007, 09:10   #5
ka0s
Member
 
Iscritto dal: Nov 2005
Messaggi: 151
grazie andbin!!

l'unica parte che non capisco bene è questa però:
(strchr restituisce un puntatore al carattere '\n' in questo caso? e nel caso lo trova (!= NULL) inserisce il carattere di terminazione stringa '\0' ? lo interpreto cosi...)
Codice:
if ((p = strchr (&buf[len], '\n')) != NULL)
            *p = '\0';
poi però ho un problema piu concreto... cioè, dal main o da qualsiasi altra funzione, come faccio a far inserire all'utente una stringa e poi usare la tua funzione?
__________________
ka0s
ka0s è offline   Rispondi citando il messaggio o parte di esso
Old 03-02-2007, 10:00   #6
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Messaggi: 5206
Quote:
Originariamente inviato da ka0s
l'unica parte che non capisco bene è questa però:
(strchr restituisce un puntatore al carattere '\n' in questo caso? e nel caso lo trova (!= NULL) inserisce il carattere di terminazione stringa '\0' ? lo interpreto cosi...)
Codice:
if ((p = strchr (&buf[len], '\n')) != NULL)
            *p = '\0';
Esatto, se trovo il '\n' lo rimpiazzo di brutto con il carattere nullo.

Quote:
Originariamente inviato da ka0s
poi però ho un problema piu concreto... cioè, dal main o da qualsiasi altra funzione, come faccio a far inserire all'utente una stringa e poi usare la tua funzione?
Ecco un esempio di codice:
Codice:
char *s;

printf ("Inserisci una stringa: ");
s = read_line_string (stdin);

if (s != NULL)
{
    /* ...fai quello che vuoi ... */

    free (s);
}
P.S. faccio solo presente che ho corretto il codice che ho postato sopra. Invece di:
fgets (&buf[len], block, f);

ho messo:
fgets (&buf[len], capacity-len, f);

Come era prima non era sbagliato, solo non sfruttavo completamente la capacità del buffer nei cicli successivi.
__________________
Andrea, Senior Java developer – SCJP 5 (91%) • SCWCD 5 (94%)
Java Versions Cheat Sheet
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 03-02-2007, 10:38   #7
ka0s
Member
 
Iscritto dal: Nov 2005
Messaggi: 151
wow grazie!! ora funziona!!

scusa, ti chiedo un altro chiarimento (con le stringhe proprio è un casino per me!):

il programma che sto facendo prende N coppie di stringhe (quindi ho messo il codice all'interno di un ciclo, ed ho tolto la funzione free) e ad ogni iterazione del ciclo passa le due stringhe ad una funzione che deve salvarle in un campo di una struttura (ad esempio il campo "nome") se non sono già state memorizzate prima... praticamente uso una linked list nella quale ogni nodo è una struct di un certo tipo, dopo l'inserimento di ogni coppia di stringhe il programma controlla se per ogni nodo->nome corrisponde una delle due stringhe passate, e nel caso non trovi valori uguali deve creare un altro nodo con il nome della stringa in questione.

Il fatto è che anche se inserisco stringhe tutte uguali me le prende tutte come fossero diverse... per cui ho due dubbi:
1. come confronto due stringhe passate come argomento ad una funzione? (io usavo '==' ma a questo punto credo che non vada bene)
2. c'è qualche problema nel memorizzare la stringa, ottenuta con la funzione che mi hai scritto tu, in una struttura? (come definisco dentro la struttura il campo nome?)

scusa ma veramente sono bloccato con questi problemi "stupidi"...
__________________
ka0s
ka0s è offline   Rispondi citando il messaggio o parte di esso
Old 03-02-2007, 10:50   #8
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Messaggi: 5206
Quote:
Originariamente inviato da ka0s
1. come confronto due stringhe passate come argomento ad una funzione? (io usavo '==' ma a questo punto credo che non vada bene)
Usando == compari gli indirizzi delle due stringhe, che essendo state entrambe allocate dinamicamente non possono certo avere lo stesso indirizzo.
Per confrontare il contenuto di 2 stringhe devi usare la funzione strcmp (o strncmp per un confronto al massimo di 'n' caratteri).

Quote:
Originariamente inviato da ka0s
2. c'è qualche problema nel memorizzare la stringa, ottenuta con la funzione che mi hai scritto tu, in una struttura? (come definisco dentro la struttura il campo nome?)
Nella struttura devi mettere un puntatore a char, cioè ad esempio char *str;
__________________
Andrea, Senior Java developer – SCJP 5 (91%) • SCWCD 5 (94%)
Java Versions Cheat Sheet
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 03-02-2007, 11:08   #9
ka0s
Member
 
Iscritto dal: Nov 2005
Messaggi: 151
grazie veramente!! ora ho risolto!!
__________________
ka0s
ka0s è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Samsung Micro RGB R95H, il primo LCD a LED rossi, verdi e blu di Samsung alla prova del banco di misura Samsung Micro RGB R95H, il primo LCD a LED rossi...
iPhone 18 Pro: la recensione del miglior iPhone compatto di sempre iPhone 18 Pro: la recensione del miglior iPhone ...
Panasonic, 30 anni di Toughbook: la "Bibbia" di mille regole dietro i nuovi G3 e 34 Panasonic, 30 anni di Toughbook: la "Bibbia...
realme C100x, lo smartphone economico con la batteria da 7500 mAh. La recensione realme C100x, lo smartphone economico con la bat...
Star Wars Zero Company è l'erede di XCOM 2 Star Wars Zero Company è l'erede di XCOM ...
Android Auto, il nuovo lettore porta in ...
I nuovi MacBook con display OLED potrebb...
Windows 11: l'aggiornamento KB5124010 fa...
iPhone Duo, la pellicola protettiva del ...
Memorie più costose, NVIDIA aumen...
TSMC potrebbe affiancare Intel nel proge...
Windows 11, un solo simbolo può risparmi...
Niente cloud, niente abbonamenti, niente...
Prime o meno, Amazon è piena di o...
Kindle in offerta: e-reader base a 89€ e...
Hackerato l'account ufficiale Microsoft ...
Tutti i dispositivi Ring: videocamere 2K...
Memorie HBM, la domanda si concentra su ...
Dash cam 70mai 4K da 74,99€: A800 Nano, ...
Nuovi rincari da Fastweb: l'operatore ha...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 16:10.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v