Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Roborock Qrevo Curv 2 Flow: ora lava con un rullo
Roborock Qrevo Curv 2 Flow: ora lava con un rullo
Qrevo Curv 2 Flow è l'ultima novità di casa Roborock per la pulizia di casa: un robot completo, forte di un sistema di lavaggio dei pavimenti basato su rullo che si estende a seguire il profilo delle pareti abbinato ad un potente motore di aspirazione con doppia spazzola laterale
Alpine A290 alla prova: un'auto bella che ti fa innamorare, con qualche limite
Alpine A290 alla prova: un'auto bella che ti fa innamorare, con qualche limite
Abbiamo guidato per diversi giorni la Alpine A290, la prima elettrica del nuovo corso della marca. Non è solo una Renault 5 sotto steroidi, ha una sua identità e vuole farsi guidare
Recensione HONOR Magic 8 Lite: lo smartphone indistruttibile e instancabile
Recensione HONOR Magic 8 Lite: lo smartphone indistruttibile e instancabile
Abbiamo provato a fondo il nuovo Magic 8 Lite di HONOR, e per farlo siamo volati fino a Marrakech , dove abbiamo testato la resistenza di questo smartphone in ogni condizione possibile ed immaginabile. Il risultato? Uno smartphone praticamente indistruttibile e con un'autonomia davvero ottima. Ma c'è molto altro da sapere su Magic 8 Lite, ve lo raccontiamo in questa recensione completa.
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 24-07-2007, 09: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, 10:17   #2
recoil
Senior Member
 
L'Avatar di recoil
 
Iscritto dal: Jul 2002
Città: Milano
Messaggi: 19149
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, 10: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, 10:34   #4
recoil
Senior Member
 
L'Avatar di recoil
 
Iscritto dal: Jul 2002
Città: Milano
Messaggi: 19149
hanno fantasia quelli che danno sti esercizi eh
recoil è offline   Rispondi citando il messaggio o parte di esso
Old 24-07-2007, 10: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 10:41.
Furla è offline   Rispondi citando il messaggio o parte di esso
Old 24-07-2007, 10: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, 10:46   #7
recoil
Senior Member
 
L'Avatar di recoil
 
Iscritto dal: Jul 2002
Città: Milano
Messaggi: 19149
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, 10: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, 10: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, 10: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, 11: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, 11:06   #12
recoil
Senior Member
 
L'Avatar di recoil
 
Iscritto dal: Jul 2002
Città: Milano
Messaggi: 19149
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, 11: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, 11: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, 11: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 11:35.
xbubbax è offline   Rispondi citando il messaggio o parte di esso
Old 24-07-2007, 11: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, 11: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, 15: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, 15: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, 15: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


Roborock Qrevo Curv 2 Flow: ora lava con un rullo Roborock Qrevo Curv 2 Flow: ora lava con un rull...
Alpine A290 alla prova: un'auto bella che ti fa innamorare, con qualche limite Alpine A290 alla prova: un'auto bella che ti fa ...
Recensione HONOR Magic 8 Lite: lo smartphone indistruttibile e instancabile Recensione HONOR Magic 8 Lite: lo smartphone ind...
Sony WF-1000X M6: le cuffie in-ear di riferimento migliorano ancora Sony WF-1000X M6: le cuffie in-ear di riferiment...
Snowflake porta l'IA dove sono i dati, anche grazie a un accordo con OpenAI Snowflake porta l'IA dove sono i dati, anche gra...
L'intelligenza artificiale ha reso pi&ug...
L'intelligenza artificiale per lo svilup...
Il sistema di verifica dell'identit&agra...
Ora è ufficiale: Samsung sta per ...
Motorola Edge 70 Fusion: ecco le specifi...
8TB a meno di 170€: il richiestissimo Ha...
Il nuovo MacBook 'low cost' arriver&agra...
Pokémon Rosso Fuoco e Verde Fogli...
Risparmiare con le offerte Amazon: weeke...
Gli Xiaomi 17 arrivano a fine febbraio, ...
48.000 Pa a poco più di 100€: la ...
PC più potente, meno spesa: su Amazon to...
Con 2 acquisti si ottiene il 40% di scon...
Blocco VPN in Spagna durante le partite ...
ECOVACS DEEBOT T30C OMNI GEN2 torna a 34...
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: 23:50.


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