Newsgroup: it.comp.lang.c
Titolo: primo programma in C e primo problema

 
	Salve a tutti,
	Scusate sin da ora l'eventuale banalità della domanda ma sono alle
	primissime armi con il C...
	Il mio problema riguarda il listato sotto:
*****************************************************************
#include <stdio.h>
#include <stdlib.h>
char bitrate[4], *comando;
int main()
{
	printf("Inserisci il bitrate \n");
	scanf("%s", bitrate);
	printf("il bitrate scelto è pari a %s Kbps \n", bitrate);
	comando = "lame -h -b %s /home/file.wav /home/file.mp3",bitrate;
	system(comando);
}
*************************************************************************
	In pratica si tratta di una mini-applicazione per creare un file .mp3
	partendo da un file .wav usando l'encoder "lame" per linux.
	Lo scopo è permettere all'utente di inserire il bitrate da passare come
	parametro all'encoder, solo che la codifica resta sempre con un bitrate
	pari a 128...
	Ho provato anche a modificare la linea di codice interessata ma non è
	cambiato niente se non l'apparizione di messaggi d'errore da parte del
	compilatore (gcc)...
	Sul manuale che sto usando ("Programmare in C" - APOGEO) e sul web non ho
	trovato la soluzione, quindi, se qualcuno tra i frequentatori del
	newsgroup potesse suggerirmi il modo per inserire il bitrate al posto di
	%s nella linea di comando, ne sarei molto felice... ;-)
	Grazie in anticipo a quanti vorranno rispondere
	Lammax
 

 	comando = "lame -h -b %s /home/file.wav /home/file.mp3",bitrate;
quello che volevi fare lo puoi fare con sprintf che e' come
la printf ma "stampa" su una stringa (comando) invece che
sullo stdout.
Pero' prima devi allocare, staticamente o dinamicamente,
abbastanza memoria per contenere il comando,
tipo
char comando[200];
o
comando=malloc(200);
ciao,
e.

Caro Estintore ha scritto:

Oppure usi strcpy, dopo aver sempre scelto di allocare staticamente (più 
semplice) o dinamicamente (più corretto).

 programma crasha.
oppure (un po' meglio) si puo' dare esplicitamente il numero massimo di 
caratteri da leggere
scanf("%3s", bitrate);
Giorgio

 semplice) o dinamicamente (più corretto).
Grazie per le risposte...
Rileggendo un po' di doc ho capito che in C non è possibile assegnare il
valore di una variabile stringa ad un'altra come si fa in altri linguaggi
(e come ho cercato di fare io con la mia "fantasiosa" istruzione :-) ).
In pratica devo sempre copiare una stringa d'origine in una stringa di
destinazione...
Tuttavia non sono venuto a capo del problema, perlomeno usando sprintf()
o strcpy().Ho invece risolto usando 2 volte la funzione strcat():
*************************************************************
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
	char bitrate[4];
	char ComandoParz1[50] = "lame -h -b ";
	char ComandoParz2[200] = " percorso/file.wav percorso/file.mp3";
	char comando[250];
	printf("Inserisci il bitrate (3 cifre!) \n");
	scanf("%3s", bitrate);
	strcat(ComandoParz1, bitrate);
	strcat(ComandoParz1, ComandoParz2);
	strcpy(comando, ComandoParz1);
	system(comando);
}
****************************************************************
Mi rendo conto che il metodo può sembrare poco "ortodosso" e per questo
mi chiedevo come fare con i metodi che mi avete suggerito...
In pratica: come posso copiare una stringa_2 in un punto preciso di
una stringa_1 senza sovrascrivere la parte restante della stringa_1...?
Un saluto, Lammax

 una stringa_1 senza sovrascrivere la parte restante della stringa_1...?
Se il "punto preciso" e' un offset di "i" caratteri, allora l'istruzione:
strcpy(stringa_1 + i, stringa_2);
Fa quello che vuoi. Se non riesci a capire il motivo, sappi che c'e' 
dietro un po' di aritmetica dei puntatori. E cmq, quando fai queste 
cose, stai sempre attento a non uscire dai limiti delle stringhe.
-- 
Mat/tia Belletti - Undergraduate student @ 
cs.unibo.it
ICQ: 33292311    - email: 
mbel...@cs.unibo.it
IRC: RedGlow     - site(s): 
http://mbellett.web.cs.unibo.it/
Jabber: RedGlow  - Linux registered user 299762 @ machine 213003

> Tuttavia non sono venuto a capo del problema, perlomeno usando sprintf()
Allora vuol dire che non hai letto cosa fa sprintf, perche'
e' semplicissimo:
sprintf(comando,"lame -h -b %s /home/file.wav /home/file.mp3",bitrate);
se uno ha bisogno di performance magari non usa sprintf, ma
per cose non critiche come queste e' molto comodo.
ciao,
e.