programmare in C: concatenare piu stringhe (principiante)

Linguaggi di programmazione: php, perl, python, C, bash e tutti gli altri.
Scrivi risposta
attorianzo
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 351
Iscrizione: giovedì 23 novembre 2006, 23:21
Contatti:

programmare in C: concatenare piu stringhe (principiante)

Messaggio da attorianzo »

Mi suggerite un modo più veloce per semplicemente concatenare delle stringhe in C ??

Codice: Seleziona tutto

	char comando[400] = "ps2pdfwr ";
	
	char *comando1 = strcat(comando, file_selezionato);
	
	char comando2[400] =  "  /home/attorianzo/Desktop/out.pdf";
	
	char *comando3 = strcat(comando1, comando2);
	
    g_print ("Comando :  %s\n", comando3);
Avatar utente
danilo84
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 929
Iscrizione: lunedì 27 novembre 2006, 9:24
Località: Taranto

Re: programmare in C: concatenare piu stringhe (principiante)

Messaggio da danilo84 »

In che senso più veloce? Per concatenare più di due stringhe contemporaneamente?
attorianzo
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 351
Iscrizione: giovedì 23 novembre 2006, 23:21
Contatti:

Re: programmare in C: concatenare piu stringhe (principiante)

Messaggio da attorianzo »

danilo84 ha scritto: In che senso più veloce? Per concatenare più di due stringhe contemporaneamente?
No.. nel senso piu..semplice..

Ad esempio in php quando voglio concatenare 3 stringhe faccio una unica, semplice istruzione.. tipo

$stringa= $stringa1.$stringa2.$stringa3."ciao";

Semplice ed efficace.. Possibile che in C non si possa fare con la stessa semplicità?
Sembrerebbe che in C devo prima dichiarare una variabile, impostarne la dimensione (come se potessi prevederlo prima..Nell'esempio ho messo "400"... E via dicendo.. Mi sembra eccessivo per una sciocchezza del genere.. :/
Avatar utente
danilo84
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 929
Iscrizione: lunedì 27 novembre 2006, 9:24
Località: Taranto

Re: programmare in C: concatenare piu stringhe (principiante)

Messaggio da danilo84 »

Non ho provato, ma potresti vedere se funziona in maniera ricorsiva, cioè fare strcat("prima",strcat("seconda","terza"));
Avatar utente
Krdan
Prode Principiante
Messaggi: 38
Iscrizione: giovedì 1 marzo 2007, 14:42

Re: programmare in C: concatenare piu stringhe (principiante)

Messaggio da Krdan »

strcat("prima",strcat("seconda","terza")); si può fare tranquillamente e funziona esattamente come dovrebbe.
Non ho capito il fatto della dimensione delle variabili, se inizializzi un array di caratteri non importa la dimensione, cioé se scrivi
char comando[] = "ps2pdfwr ";
il compilatore capisce che stai parlando di un array di 10 caratteri (9 caratteri + il carattere nullo), anzi scrivere char comando[400] è uno spreco di memoria.
Avatar utente
Uno
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 412
Iscrizione: sabato 3 marzo 2007, 21:47
Contatti:

Re: programmare in C: concatenare piu stringhe (principiante)

Messaggio da Uno »

attorianzo ha scritto:
Ad esempio in php quando voglio concatenare 3 stringhe faccio una unica, semplice istruzione.. tipo

$stringa= $stringa1.$stringa2.$stringa3."ciao";

Semplice ed efficace.. Possibile che in C non si possa fare con la stessa semplicità?
Il fatto è che la gestione della memoria in Php è diversa dal C...

in Php c'è il "raccoglitore della monnezza" ("garbage collector") che gestisce la memoria con una semplice regola:
Se non esistono più riferimenti a una variabile A allora posso distruggere A
In C invece la gestione della memoria è automatica per le variabili di scope e lasciata al programmatore per tutto il resto.

Quindi in Php è possibile fare

Codice: Seleziona tutto

$stringa= "prova"." 1"." 2"." 3"."fine";
perchè l'interprete legge le stringhe "prova", " 1", " 2", " 3", " fine" alloca la memoria necessaria a ospitarle nello stack poi le concatena e visto che nel codice seguente non ci sono più riferimenti a esse... le distrugge, tenendo solo la stringa della concatenazione.

Invece in C rimarrebbero in memoria tutte le stringhe e oltretutto non esistendo più riferimenti a esse non si potrebbero più distruggere memory leak, quindi un meccanismo simile sarebbe controproducente.
:-\
porco diodo...
attorianzo
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 351
Iscrizione: giovedì 23 novembre 2006, 23:21
Contatti:

Re: programmare in C: concatenare piu stringhe (principiante)

Messaggio da attorianzo »

Grazie a tutti per i vostri interventi e per le dettagliate spiegazioni :)

Ho sostituito quel codice (vedi primo post di questo thread), con quest'altro:

Codice: Seleziona tutto

char comando;
comando =  strcat("ps2pdfwr ", strcat(file_selezionato, " /home/attorianzo/Desktop/out.pdf"));

g_print ("Comando :  %s\n", comando);
Non va.. Compila correttamente ma all'esecuzione non arriva al g_print, restituendomi un errore "Program has been terminated receiving signal 11 (Segmentation fault)"

Cosa non va? (lo script nel primo post funzionava.. ) ;/
Avatar utente
danilo84
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 929
Iscrizione: lunedì 27 novembre 2006, 9:24
Località: Taranto

Re: programmare in C: concatenare piu stringhe (principiante)

Messaggio da danilo84 »

danilo84 ha scritto: Non ho provato, ma potresti vedere se funziona in maniera ricorsiva, cioè fare strcat("prima",strcat("seconda","terza"));
La devi modificare in questo modo:

Codice: Seleziona tutto

strcat(strcat(strcat(comando,"ps2pdfwr ")," /home/attorianzo/Desktop/out.pdf"),"file_selezionato");
perchè strcat vuole come primo argomento la stringa di destinazione, cioè dove deve unire le stringhe. vedi qui

In più devi dichiarare comando in questo modo:

Codice: Seleziona tutto

char comando[100];
o della dimensione che vuoi...oppure

Codice: Seleziona tutto

char *comando;
attorianzo
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 351
Iscrizione: giovedì 23 novembre 2006, 23:21
Contatti:

Re: programmare in C: concatenare piu stringhe (principiante)

Messaggio da attorianzo »

Nulla da fare... non funziona.. il solito segmentation fault.. Nel frattempo, armeggiando sul tuo consiglio ho trovato una nuova situazione che funziona:

Codice: Seleziona tutto

char comando[200] = "ps2pdfwr ";
strcat(strcat(comando, file_selezionato)," /home/attorianzo/Desktop/out.pdf");
g_print ("Comando :  %s\n",  comando);
Il problema è che devo necessariamente specificare una dimensione per la variabile "comando", che sia abbastanza grande da contenere tutta la stringa che vi unirò con lo strcat (in questo caso 200).

Non c'è verso di impostarlo diversamente se non voglio avere il segmentation fault.

Ho provato char *comando ..nulla :/
Avatar utente
jack84
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 493
Iscrizione: lunedì 12 febbraio 2007, 11:13

Re: programmare in C: concatenare piu stringhe (principiante)

Messaggio da jack84 »

Provo a darti un'idea, non sò se si possa fare, con strlenght() puoi ottenere la lunghezza delle stringhe che hai e poi con 
malloc() puoi definirti un vettore dinamico della dimensione di cui necessiti (ottenuta con strlenght).
Non sempre si può prevedere, ma ci si può sempre preparare
attorianzo
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 351
Iscrizione: giovedì 23 novembre 2006, 23:21
Contatti:

Re: programmare in C: concatenare piu stringhe (principiante)

Messaggio da attorianzo »

Mmm... Temo di non essere abbastanza esperto per fare questo.. almeno per ora :(
Avatar utente
jack84
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 493
Iscrizione: lunedì 12 febbraio 2007, 11:13

Re: programmare in C: concatenare piu stringhe (principiante)

Messaggio da jack84 »

Il programma va bene così, ma ti assicuro che non è difficile modificarlo per allocare lo spazio al meglio, puoi consultare man oppure google sulle funzioni  che ti ho suggerito (strlen non strlenght mi sono confuso).
Alcune spiegazioni utili:
http://digilander.libero.it/uzappi/C/librerie/funzioni/strlen.html
http://edu.os3.it/html/manual/impararec/node83.html
Prova se ti và a capaire come fare da solo, nel caso hai qualche dubbio ti aiuto volentieri :)
Non sempre si può prevedere, ma ci si può sempre preparare
Avatar utente
Uno
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 412
Iscrizione: sabato 3 marzo 2007, 21:47
Contatti:

Re: programmare in C: concatenare piu stringhe (principiante)

Messaggio da Uno »

attorianzo ha scritto: Nulla da fare... non funziona.. il solito segmentation fault.. Nel frattempo, armeggiando sul tuo consiglio ho trovato una nuova situazione che funziona:

Codice: Seleziona tutto

char comando[200] = "ps2pdfwr ";
strcat(strcat(comando, file_selezionato)," /home/attorianzo/Desktop/out.pdf");
g_print ("Comando :  %s\n",  comando);
Tale codice è molto poco efficiente e soprattutto write-only, cioè una volta scritto è difficile da capire e difficile da mantenere, io ti consiglio di scrivere una funzione a più argomenti per concatenare un numro qualsiasi di stringhe.

Prova a dare un occhiata a questo:

Codice: Seleziona tutto


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

char *SuperStringsCat (char *String1, ...)
{
	va_list List;
	
	va_start (List, String1);
	
	unsigned int Size;
	
	Size = strlen (String1) + 1;
	
	char *s;
	s = String1;
	
	do
	{
		Size += strlen (s) + 1;
	}while ((s = va_arg (List, char*)) != NULL);
	
	char *Merge;
	Merge = (char*)malloc (sizeof (char) * Size);
	char *sMerge = Merge;

	va_end (List);
	va_start (List, String1);

	s = String1;
	
	do
	{
		strcpy (Merge, s);
		Merge += strlen (s);
	}while ((s = va_arg (List, char*)) != NULL);
	
	va_end (List);
	
	return sMerge;

}

int main (int argc, char *argv[])
{
	char *p;
	p = SuperStringsCat ("prova", " 1,", " 2,", " 3", "...", NULL);
	printf ("%s\n", p);
	
	return 0;
}
porco diodo...
Scrivi risposta

Ritorna a “Programmazione”

Chi c’è in linea

Visualizzano questa sezione: Bing [Bot], Google [Bot] e 2 ospiti