Torna indietro   Hardware Upgrade Forum > Software > Programmazione

ASUS Zenbook 14 (UX3480AA): tanta autonomia con uno chassis bello e robusto
ASUS Zenbook 14 (UX3480AA): tanta autonomia con uno chassis bello e robusto
Lo chassis in Ceraluminium è il cuore di questo notebook in edizione 2026, un modello pensato per garantire produttività con le tipiche applicazioni di produttività personale e capace di offrire un'autonomia di funzionamento lontano dalla presa di corrente da riferimento. Potenza, facilità di trasporto e costruzione robusta tutto in un notebook compatto.
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
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 24-07-2007, 08:08   #1
xbubbax
Senior Member
 
Iscritto dal: Apr 2007
Messaggi: 381
[C] Esercizio su stringhe

Qualcuno mi da un idea su come procedere per fare questo esercizio
Io qualche idea ce l'ho ma non so come applicarla. Ad esempio ho pensato di prendere gli n caratteri della stringa s2 e di attaccarli alla fine della stringa s1, ma non so come farlo in C

Si scriva una funzione
char _strncat_(char *s1, const char *s2, int n)
tale funzione appende al massimo n caratteri della stringa s2 alla stringa s2.
Ad esempio se
s1=pippo
s2=pluto
n=3
output=pippoplu
xbubbax è offline   Rispondi citando il messaggio o parte di esso
Old 24-07-2007, 09:17   #2
recoil
Senior Member
 
L'Avatar di recoil
 
Iscritto dal: Jul 2002
Città: Milano
Messaggi: 19150
non è difficile
per prima cosa fai passare gli elementi di s1 (inteso come array di char) fino ad arrivare allo 0 che indica la fine della stringa
da quel punto in avanti fai un ciclo con i che va da 0 a n-1 nel quale copi l'i-esimo carattere di s2 nella posizione x + i di s1, dove x è la posizione in cui hai trovato lo zero, ossia la lunghezza della stringa

ti bastano un paio di cicli for
recoil è offline   Rispondi citando il messaggio o parte di esso
Old 24-07-2007, 09:31   #3
AngeL)
Senior Member
 
L'Avatar di AngeL)
 
Iscritto dal: May 2006
Città: Salerno
Messaggi: 936
http://www.hwupgrade.it/forum/showth...7#post14647777
AngeL) è offline   Rispondi citando il messaggio o parte di esso
Old 24-07-2007, 09:34   #4
recoil
Senior Member
 
L'Avatar di recoil
 
Iscritto dal: Jul 2002
Città: Milano
Messaggi: 19150
hanno fantasia quelli che danno sti esercizi eh
recoil è offline   Rispondi citando il messaggio o parte di esso
Old 24-07-2007, 09:35   #5
Furla
Senior Member
 
Iscritto dal: Feb 2004
Messaggi: 1454
ciao, immagino tu sappia già cos'è una stringa in C e come viene rappresentata...

io mi sto divertendo a scrivere qualche funzione sulle stringhe, tipo quelle in <cstring>, devo dire che sono molto semplici da implementare. ti consiglio di dividere il problema in sottoproblemi più piccoli e semplici da risolvere, magari facendoti prima uno schema cartaceo.

inoltre le stringhe si adattano bene all'uso dell'aritmetica dei puntatori più che ad essere trattate come semplici array, ad esempio per avere il puntatore a fine stringa basta questo:
Codice:
char* EOS(char* str)
{
 while(*str) str++;
 return str;
}
scrivi qualcosa da solo e se ti blocchi posta il codice, ti daremo volentieri una mano

PS: EVITA di leggere soluzioni di altre persone, ci siamo passati tutti ed è importante cavarsela da soli, noi dovremmo solo farti notare i tuoi errori.

Ultima modifica di Furla : 24-07-2007 alle 09:41.
Furla è offline   Rispondi citando il messaggio o parte di esso
Old 24-07-2007, 09:40   #6
xbubbax
Senior Member
 
Iscritto dal: Apr 2007
Messaggi: 381
In che senso hanno fantasia? Questo esercizio l'ho trovato su un sito dell'università di roma e lo sto usando per esercitarmi, comq....

non ho capito quando dici copiare l'i-esimo carattere. come faccio a copiarlo?

poi un'altra cosa, il vettore s1 lo devo dichiarare con il numero di elementi necessari a memorizzare la stringa 1 oppure lo dichiaro con tanti elementi in modo da poterci "incollare" anche i caratteri di s2?
xbubbax è offline   Rispondi citando il messaggio o parte di esso
Old 24-07-2007, 09:46   #7
recoil
Senior Member
 
L'Avatar di recoil
 
Iscritto dal: Jul 2002
Città: Milano
Messaggi: 19150
Quote:
Originariamente inviato da xbubbax Guarda i messaggi
In che senso hanno fantasia? Questo esercizio l'ho trovato su un sito dell'università di roma e lo sto usando per esercitarmi, comq....
nel senso che era uguale ad un altro esercizio
pensavo fosse un "compito a casa" per un qualche esame e che usassero sempre le stesse tracce

Quote:
non ho capito quando dici copiare l'i-esimo carattere. come faccio a copiarlo?
è un semplice assegnamento
s1[x + i] = s2[i]

Quote:
poi un'altra cosa, il vettore s1 lo devo dichiarare con il numero di elementi necessari a memorizzare la stringa 1 oppure lo dichiaro con tanti elementi in modo da poterci "incollare" anche i caratteri di s2?
se devi limitarti a scrivere quella funzione non devi dichiarare il vettore s1, te lo ritrovi come parametro e vi accedi con le [ ] come ho scritto sopra. si suppone che ti arrivi un array abbastanza grande
se devi scrivere anche la funzione che chiama _strncat_ allora sì, devi dichiarere tu s1 e lo devi fare grande abbastanza per tenere quello che c'è in origine + n caratteri di s2 + 1 byte finale per mettere lo zero di fine stringa
recoil è offline   Rispondi citando il messaggio o parte di esso
Old 24-07-2007, 09:51   #8
xbubbax
Senior Member
 
Iscritto dal: Apr 2007
Messaggi: 381
char *_strncat_(char *s1, const chat *s2, int n){

void *memcpy(*s1, const *s2, n)

utilizzando questa funzione non è piu semplice?

come dovrei proseguire però?
xbubbax è offline   Rispondi citando il messaggio o parte di esso
Old 24-07-2007, 09:56   #9
xbubbax
Senior Member
 
Iscritto dal: Apr 2007
Messaggi: 381
vabbè ora provo a farlo con il ciclo,
xbubbax è offline   Rispondi citando il messaggio o parte di esso
Old 24-07-2007, 09:59   #10
xbubbax
Senior Member
 
Iscritto dal: Apr 2007
Messaggi: 381
char *_strncat_(char *s1, const chat *s2, int n){

for(;*s1!='\0';*s1++){
for(

ho scritto questo ma è sbagliato

cioè come faccio a dire, quando sei arrivato al carattere nullo copia gli elementi di s2 in quel punto?

è la cosa piu stupida che esiste ma non mi viene
xbubbax è offline   Rispondi citando il messaggio o parte di esso
Old 24-07-2007, 10:04   #11
xbubbax
Senior Member
 
Iscritto dal: Apr 2007
Messaggi: 381
Va bene una cosa del genere?






char *_strncat_(char *s1, const chat *s2, int n){

while(*s1!='\0'){
*s1++;}
for(;i=0;i<n;i++){
*s1=*s2;
*s2++;}
xbubbax è offline   Rispondi citando il messaggio o parte di esso
Old 24-07-2007, 10:06   #12
recoil
Senior Member
 
L'Avatar di recoil
 
Iscritto dal: Jul 2002
Città: Milano
Messaggi: 19150
la memcpy fa un'altra cosa, copia n byte da s2 a s1 però non si posiziona alla fine della stringa, li copia all'inizio

per il resto fai un
for (i = 0; i < n; i++, s1++)
{
s2[i] = *s1;
}
s2[i] = 0;
recoil è offline   Rispondi citando il messaggio o parte di esso
Old 24-07-2007, 10:07   #13
xbubbax
Senior Member
 
Iscritto dal: Apr 2007
Messaggi: 381
Non ho capito se questo pezzetto è giusto o sbagliato






char *_strncat_(char *s1, const chat *s2, int n){

while(*s1!='\0'){
*s1++;}
for(;i=0;i<n;i++){
*s1=*s2;
*s2++;}
xbubbax è offline   Rispondi citando il messaggio o parte di esso
Old 24-07-2007, 10:10   #14
xbubbax
Senior Member
 
Iscritto dal: Apr 2007
Messaggi: 381
Il programma fino ad ora è questo

Codice HTML:
#include <stdio.h>

char *_strncat_(char *s1, const char *s2, int n); /*Prototipo della funzione*/

int main(){
    
          char stringa1[40];
          char stringa2[10];
          int n;
          
          prtint("Inserisci due stringhe minori di 10 caratteri e un numero intero:\n");
          scanf("%s%s%d", &stringa1, &stringa2, &n);
          
          
          
          
          
          
          
          
          
char *_strncat_(char *s1, const chat *s2, int n){
     
                                                  while(*s1!='\0'){
                                                                   *s1++;}
                                                  for(;i=0;i<n;i++){
                                                                    *s1=*s2;
                                                                    *s2++;}
xbubbax è offline   Rispondi citando il messaggio o parte di esso
Old 24-07-2007, 10:30   #15
xbubbax
Senior Member
 
Iscritto dal: Apr 2007
Messaggi: 381
ho provato a farlo anche in quest'altro modo, ditemi quale dei due è migliore, sempre se sono corretti

Ultima modifica di xbubbax : 24-07-2007 alle 10:35.
xbubbax è offline   Rispondi citando il messaggio o parte di esso
Old 24-07-2007, 10:35   #16
xbubbax
Senior Member
 
Iscritto dal: Apr 2007
Messaggi: 381
Codice HTML:
char *strncat(char *s1, const chat *s2, int n){
                                               int lung;
                                               lung = strlen(*s1);
                                               
                                               for(i=0;i<n;i++){
                                                                s1[lung+1]=*s2;
                                                                lung += 1;
                                                                *s2++;}
xbubbax è offline   Rispondi citando il messaggio o parte di esso
Old 24-07-2007, 10:47   #17
xbubbax
Senior Member
 
Iscritto dal: Apr 2007
Messaggi: 381
fate finta di non averl letto i messaggi precedenti, ho provato a fare il programma completo

ditemi se potrebbe funzionare

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

char *strncat(char *s1, const char *s2, int n);
          
int main(){
    
           char stringauno[30];
           char stringadue[10];
           int n;
           printf("Inserisci due stringhe e un intero:\n");
           scanf("%s%s%d", stringauno, stringadue, &n);
           
           strncat(stringauno, stringadue, n);
           
           printf("%s\n", stringauno);}
          
          
          
char *strncat(char *s1, const char *s2, int n){
                                               int lung;
                                               lung = strlen(*s1);
                                               
                                               for(i=0;i<n;i++){
                                                                s1[lung+1]=*s2;
                                                                lung += 1;
                                                                *s2++;}
                                               return *s1;}
xbubbax è offline   Rispondi citando il messaggio o parte di esso
Old 24-07-2007, 14:34   #18
trallallero
Senior Member
 
L'Avatar di trallallero
 
Iscritto dal: May 2006
Città: Wursteland
Messaggi: 1749
Codice:
#include <stdio.h>
#include <string.h>

// se usi strncat ti da errore perche' la funzione esiste gia' nel .h che includi (string.h) 
//char *strncat(char *s1, const char *s2, int n);
char *_strncat(char *s1, const char *s2, int n);
          
int main()
{
	char stringauno[30];
	char stringadue[10];
	int n;

	// ti conviene sempre azzerare le stringhe che utilizzi per eliminare le porcherie
	memset( stringauno, 0, sizeof(stringauno) );
	memset( stringadue, 0, sizeof(stringadue) );

	printf("Inserisci due stringhe e un intero:\n");
	scanf("%s%s%d", stringauno, stringadue, &n);

	_strncat(stringauno, stringadue, n);

	printf("%s\n", stringauno);

	return 0; // il main ritorna int
}
          
          
          
char *_strncat(char *s1, const char *s2, int n)
{
	int lung;

	// strlen vuole il puntatore quindi s2 non *s2
	//lung = strlen(*s1);
	lung = strlen( s1);
	
	// i dov'e' dichiarato ???
	int i; // aggiunto io

	for( i = 0; i < n; i++ )
	{
		// s1[lung]     punta al terminatore della stringa
		// s1[lung + 1] punta quindi al carattere dopo il terminatore
		// quindi tutto cio' che aggiungi non lo vedrai mai perche' dopo lo \0
		//s1[lung + 1] = *s2;
		s1[lung] = *s2;
		lung += 1;
		// devi incrementare il puntatore non il valore
		// anche se ti va bene lo stesso perche' * non ha la precedenza quindi 
		// in questo caso viene ignorato, ma in C e' rigoroso essere puliti ed ordinati 
		//*s2++;
		s2++;
	}
	// la funzione deve tornare un puntatore quindi s1 non *s1
	//return *s1;
	return s1;
}
voto: 5--
__________________
Nintendo WIII 4d Turbo Intercooler - Sestium X 666 99,312 GHz - 6.984 Ram Σ(9999) MHz - HDD SATA 97e^(10) bytes 93³ rpm - ATI biberon X900z ∞Mb - Win Eight SP (1 > yours) 16 Valve
trallallero è offline   Rispondi citando il messaggio o parte di esso
Old 24-07-2007, 14:40   #19
sottovento
Senior Member
 
L'Avatar di sottovento
 
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
Manca ancora qualcosa, visto che la funzione deve copiare AL MASSIMO n caratteri...
__________________
In God we trust; all others bring data
sottovento è offline   Rispondi citando il messaggio o parte di esso
Old 24-07-2007, 14:49   #20
trallallero
Senior Member
 
L'Avatar di trallallero
 
Iscritto dal: May 2006
Città: Wursteland
Messaggi: 1749
Quote:
Originariamente inviato da sottovento Guarda i messaggi
Manca ancora qualcosa, visto che la funzione deve copiare AL MASSIMO n caratteri...
questo mica e´ li per bellezza
Codice:
for( i = 0; i < n; i++ )
__________________
Nintendo WIII 4d Turbo Intercooler - Sestium X 666 99,312 GHz - 6.984 Ram Σ(9999) MHz - HDD SATA 97e^(10) bytes 93³ rpm - ATI biberon X900z ∞Mb - Win Eight SP (1 > yours) 16 Valve
trallallero è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


ASUS Zenbook 14 (UX3480AA): tanta autonomia con uno chassis bello e robusto ASUS Zenbook 14 (UX3480AA): tanta autonomia con ...
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...
Spotifast sfida Spotify: il client open ...
Oltre i benchmark: le specifiche importa...
Euro digitale, la BCE fissa le date dei ...
Photopea, polemica con GitHub: le copie ...
Curiosity fotografa l'alba su Marte: le ...
Amazon Kids+ arriva in Italia: giochi, v...
Amazon svela i nuovi Alexa Tablet! Googl...
OPPO Find X10 Series sarà present...
Google e Zuckerberg puntano sulla cellul...
MSI Prestige N16 Flip AI+ disponibile su...
Proofpoint presenta Agentic Data and AI ...
Instagram porta i nuovi strumenti di edi...
NVIDIA, l'accordo da 20 miliardi con Gro...
Una macchina da caffè ha generato 1 TB i...
Samsung, vendere smartphone conviene sem...
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: 17:20.


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