Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Recensione realme 16 5G: lo smartphone con Selfie Mirror ha una batteria da 6550mAh
Recensione realme 16 5G: lo smartphone con Selfie Mirror ha una batteria da 6550mAh
realme 16 5G è un nuovo smartphone con sensore Sony IMX 852 da 50MP sul retro e uno specchio selfie fisico integrato nella camera bar, una prima nel segmento di mercato. Batteria da 6550mAh in un corpo da 8,1mm e 183g, certificazione IP69K e ricarica da 45W completano un pacchetto aggressivo per la fascia media, per uno dei prodotti più interessanti del produttore sul piano commerciale
Come rispettare tutte le nuove regole per i monopattini elettrici? La guida per non rischiare sanzioni
Come rispettare tutte le nuove regole per i monopattini elettrici? La guida per non rischiare sanzioni
Sono ormai definitive le nuove norme del Codice della Strada per i monopattini elettrici. Non solo targa e assicurazione, le regole sono tante e riguardano diversi aspetti, vi spieghiamo come evitare sanzioni che possono essere salate
DLSS 4.5: con Dynamic Frame Generation e MFG 6X NVIDIA alza la posta
DLSS 4.5: con Dynamic Frame Generation e MFG 6X NVIDIA alza la posta
DLSS 4.5 introduce Dynamic Multi Frame Generation e MFG 6X, permettendo fino a cinque frame generati per ogni frame renderizzato. I test su Cyberpunk 2077 e 007 First Light mostrano forti incrementi di FPS e riduzione della latenza su RTX 5090 Laptop. Migliorano fluidità, stabilità e qualità visiva.
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 12-06-2009, 19:14   #1
Gr1ph00n
Member
 
Iscritto dal: Oct 2006
Messaggi: 67
[C] problema stringhe in liste

Salve a tutti, posto in questa sezionepoichè stò avendo alcuni problemi con un'implementazione, stavo cercando di capire come utilizzare le liste collegate e mi era parso ideale implementare una rubrica. Non ci ho messo molto a realizzarne una semplice, fatto stà che ho un problema con la visualizzazione dei vari campi. Mi spiego meglio, andando a stampare i valori memorizzati con la printf, oltre ai valori che io ho messo, me ne escono anche altri che sono percorsi di file e cartelle, variabili di windows....

Eccovi il mio codice:

Codice:

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

#define MAX_CHAR 30

typedef int BOOL;

#define FALSE 0
#define TRUE !FALSE



typedef struct _rubrica
{
	int id;
	char cognome[MAX_CHAR];
	char nome[MAX_CHAR];
	char numero[MAX_CHAR];
	struct _rubrica *prev;
	struct _rubrica *next;
} rubrica;

typedef struct _lista
{
	rubrica *primo;
	rubrica *ultimo;
} lista;

int menu();
void aggiungi();
void rimuovi();
void visualizza();
void aggiungi_dopo(rubrica *r1, rubrica *r2);
void raccogli_dati(rubrica *r);
rubrica *ottieni_ultimo();
void trim(char *s1);
void aggiungi_inizio(rubrica *r);
void aggiungi_prima(rubrica *r1, rubrica *r2);
void stampa_nodo(rubrica *r);
rubrica *cerca(const int id);
void rimuovi_nodo(rubrica *r);

int rubriche_totali;

lista *list = NULL;

int main (void)
{
	
	void (*f[2])(void);
	int scelta;
	list = malloc(sizeof(lista));
	if (list != NULL)
	{
		list->primo = NULL;
		list->ultimo = NULL;
	}
	
	f[0] = aggiungi;
	f[1] = rimuovi;
	f[2] = visualizza;
	
	printf("RUBRICA 0.1\n");
	scelta = menu();
	while (scelta)
	{
		if (scelta > 3)
		{
			scelta = menu();
			continue;
		}
		f[scelta - 1]();
		scelta = menu();
	}
	system("PAUSE");
	return 0;
}

int menu ()
{
	int ret;
	printf("SELEZIONARE OPZIONE:\n1. Aggiungi\n2. Cancella\n3. Visualizza tutto\n0.Esci\n=> ");
	scanf("%d", &ret);
	printf("\n");
	return ret;
}

rubrica *ottieni_ultimo()
{
	return list->ultimo;
}

void trim(char *s1)
{
    while (TRUE)
    {
        if (*s1 == '\n')
        {   
            *s1 = '\0';
            break;
        }
        s1++;
    }
}

void raccogli_dati(rubrica *r)
{
	char cognome[MAX_CHAR];
	char nome[MAX_CHAR];
	char numero[MAX_CHAR];
	printf("inserire cognome:\n");
	fflush(stdin);
	fgets(cognome, sizeof(cognome), stdin); 
	trim(cognome);
	printf("inserire nome:\n");
	fflush(stdin);
	fgets(nome, sizeof(nome), stdin); 
	trim(nome);
	printf("inserire numero:\n");
	fflush(stdin);
	fgets(numero, sizeof(numero), stdin); 
	trim(numero);
	r->id = rubriche_totali;
	strncpy(r->cognome, cognome, strlen(cognome));
	strncpy(r->nome, nome, strlen(nome));
	strncpy(r->numero, numero, strlen(numero));
	r->prev = NULL;
	r->next = NULL;
	rubriche_totali++;
}




void aggiungi()
{
	rubrica *curr;
	rubrica *r1;
	r1 = malloc(sizeof(rubrica));
	if (r1 != NULL)
	{
		raccogli_dati(r1);
		curr = ottieni_ultimo();
		if (curr)
		{
			aggiungi_dopo(curr, r1);
		}
		else
		{
			aggiungi_inizio(r1);
		}
	}
	printf("aggiunto con id %d\n", rubriche_totali - 1);
}

void aggiungi_inizio(rubrica *r)
{
	if (list->primo)
	{
		aggiungi_prima(list->primo, r);
	}
	else
	{
		list->primo = r;
		list->ultimo = r;
		r->prev = NULL;
		r->next = NULL;
	}
}

void aggiungi_prima(rubrica *r1, rubrica *r2)
{
	r2->prev = r1->prev;
	r2->next = r1;
	if (r1->prev)
	{
		r2->prev->next = r2;
	}
	else
	{
		list->primo = r2;
	}
}

void aggiungi_dopo(rubrica *r1, rubrica *r2)
{
	r2->next = r1->next;
	r1->next = r2;
	r2->prev = r1;
	if (r2->next)
	{
		r2->next->prev = r2;
	}
	else
	{
		list->ultimo = r2;
	}
}
	
rubrica *cerca(const int id)
{
	rubrica *r1;
	r1 = ottieni_ultimo();
	int index;
	for (index = 0; index < rubriche_totali; index++)
	{
		if (r1->id == id)
		{
			return r1;
		}
		else
		{
			r1 = r1->prev;
		}
	}
	return NULL;
}

void rimuovi() 
{
	int id;
	rubrica *r1;
	printf("Inserisci l'id della rubrica da rimuovere: ");
	fflush(stdin);
	scanf("%d", &id);
	r1 = cerca(id);
	if (r1 != NULL)
	{
		rimuovi_nodo(r1);
	}
	else
	{
		printf("valore inesistente\n");
	}
}

void rimuovi_nodo(rubrica *r)
{
	if (r->prev)
	{
		r->prev->next = r->next;
	}
	else
	{
		list->primo = r->next;
	}
	
	if (r->next)
	{
                r->next->id -= 1;
		r->next->prev = r->prev;
	}
	else
	{
		list->ultimo = r->prev;
	}
	free(r);
}



void visualizza() 
{
	int id;
	rubrica *r1;
	printf("Inserisci l'id della rubrica da visualizzare: ");
	fflush(stdin);
	scanf("%d", &id);
	r1 = cerca(id);
	if (r1 != NULL)
	{
		stampa_nodo(r1);
	}
	else
	{
		printf("valore inesistente\n");
	}
}

void stampa_nodo(rubrica *r)
{
	printf("cognome=%s\nnome=%s\nnumero=%s\n", r->cognome, r->nome, r->numero);
}
Potreste aiutarmi per favore a capire dove stà l'errore ? Grazie in anticipo

Ultima modifica di Gr1ph00n : 12-06-2009 alle 19:32.
Gr1ph00n è offline   Rispondi citando il messaggio o parte di esso
Old 12-06-2009, 21:58   #2
BrutPitt
Senior Member
 
L'Avatar di BrutPitt
 
Iscritto dal: Mar 2009
Città: Bologna
Messaggi: 1174
Ho dato una scorsa veloce... ma permettimi una domanda: perche' usi "strncpy" con la lunghezza della stringa sorgente?

Codice:
	strncpy(r->cognome, cognome, strlen(cognome));
	strncpy(r->nome, nome, strlen(nome));
	strncpy(r->numero, numero, strlen(numero));
Basterebbe una semplice "strcpy".

Con "strncpy" se vuoi copiare anche il carattere nullo devi aggiungere un +1 alla lunghezza... dato che non e' aggiunto implicitamente.

Come hai fatto tu non "termini" la stringa... ed e' forse questo il motivo dei caratteri non desiderati.

Ultima modifica di BrutPitt : 12-06-2009 alle 22:10. Motivo: maggiore chiarezza
BrutPitt è offline   Rispondi citando il messaggio o parte di esso
Old 12-06-2009, 22:14   #3
Gr1ph00n
Member
 
Iscritto dal: Oct 2006
Messaggi: 67
Si, hai ragione, era quello l'errore, o meglio dovevo usare la sizeof al posto della strlen per non avere problemi, comunque ora ho risolto. Grazie per la risposta
Gr1ph00n è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Recensione realme 16 5G: lo smartphone con Selfie Mirror ha una batteria da 6550mAh Recensione realme 16 5G: lo smartphone con Selfi...
Come rispettare tutte le nuove regole per i monopattini elettrici? La guida per non rischiare sanzioni Come rispettare tutte le nuove regole per i mono...
DLSS 4.5: con Dynamic Frame Generation e MFG 6X NVIDIA alza la posta DLSS 4.5: con Dynamic Frame Generation e MFG 6X ...
Plaud NotePin S, il registratore IA si fa indossabile (ma è facile da perdere) Plaud NotePin S, il registratore IA si fa indoss...
Redmi Watch 6 in prova: lo smartwatch con ampio display da 2000 nit a meno di 100 euro Redmi Watch 6 in prova: lo smartwatch con ampio ...
L'intelligenza artificiale non sostituir...
Dopo 10 anni Steam dice addio alle gift ...
Mercato smartphone 2026: le scorte di me...
Ecco i nuovi coupon nascosti Amazon di g...
Riconoscimento facciale sì, ma so...
HONOR, supporto software al top del merc...
Spotify guarda la futuro: concerti in di...
realme GT8 Pro 12GB/256GB a 719€: è un t...
NEURA Robotics raccoglie un sacco di sol...
ASUS ROG porta in Italia i nuovi auricol...
RISC-V guarda ai datacenter: NextSilicon...
La NASA spiega perché non ci sono...
La NASA sta provando il Divergent Deploy...
Fidanzarsi con l'IA non è cos&igr...
AI Overviews: quando il riassunto &egrav...
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: 08:34.


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