PDA

Visualizza la versione completa : [C] Scrivere dentro una stringa


SpecialOne1992
25-04-2012, 23:10
questo è il testo dell'esercizio: Il nome del nuovo file deve essere costruito a partire da quello inserito dall’utente aggiungendo prima dell'estensione del file la stringa "(meta)". Ad esempio: prova.esercizio.txt -->prova.esercizio(meta).txt.
questo il mio codice che funziona se inserisco una stringa che supera i 5 caratteri come nell'esempio e invece se inserisco ad esempio solo prova.txt non va a buon fine..stampa dopo prova e prima di metà caratteri senza senso.prova.txt da me diventa-->prova**(meta).txt. Perché? grazie a che mi potrà dare una mano

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main(void){
char nome1[100],nome2[100],temp[50];
int n,i,j=0;
printf("inserisci il nome del file\n");
scanf("%s",nome1);
n=strlen(nome1)-4;
strncpy(nome2,nome1,n);
strcat(nome2,".(meta)");
for(i=n;i<=strlen(nome1);i++){
temp[j]=nome1[i];
j++;
}
strcat(nome2,temp);
printf("file creato:%s\n",nome2);
system("pause");
return 0;
}

oregon
25-04-2012, 23:31
Direi che puoi provare così



char nome1[100],nome2[100];

printf("inserisci il nome del file\n");
scanf("%s",nome1);

int n=strlen(nome1)-4;
strncpy(nome2,nome1,n);
strncpy(nome2+n,"(meta)",6);
strcpy(nome2+n+6,nome1+n);

printf("file creato:%s\n",nome2);

Who am I
26-04-2012, 12:36
Alcune considerazioni:

1)Indenta sempre il codice;
2)Non eseguire 4 volte la strlen nel for, invece fai così:



const unsigned int length=strlen(nome1);
for(i=n;i<=length;i++,j++)
temp[j]=nome1[i];


Onde evitare di calcolare più volte del dovuto la lunghezza della stringa, aumentando così la complessità temporale del programma;

3)Prevedi anche il caso in cui l' input non sia corretto, ad esempio l' utente potrebbe digitare "pippo.tx" invece di "pippo.txt", in tal caso puoi stampare un messaggio di errore:



int find(char* str, char x)
// cerca il carattere x nella stringa, ritorna l' indice, oppure -1 se
// tale carattere non è presente
{
int result=-1;
const int length=(int)strlen(str);
for(int i=0; i<length && result==-1; i++)
{
if(str[i]==x)
result=i;
}
return result;
}


Nel main puoi eseguire il controllo:



int index=find(nome1,'.');
if(index==-1 || index!= (strlen(nome1)-4) )
{
fprintf(stderr,"input non corretto");
exit(EXIT_FAILURE);
}


Nel tuo caso penso che il problema sia un input scorretto, se provi ad eseguire il codice digitando "pippo.txt" ti stampa come risultato "pippo.(meta).txt", non vedo problemi.

SpecialOne1992
26-04-2012, 15:23
Originariamente inviato da Who am I
Alcune considerazioni:

1)Indenta sempre il codice;
2)Non eseguire 4 volte la strlen nel for, invece fai così:



const unsigned int length=strlen(nome1);
for(i=n;i<=length;i++,j++)
temp[j]=nome1[i];


Onde evitare di calcolare più volte del dovuto la lunghezza della stringa, aumentando così la complessità temporale del programma;

3)Prevedi anche il caso in cui l' input non sia corretto, ad esempio l' utente potrebbe digitare "pippo.tx" invece di "pippo.txt", in tal caso puoi stampare un messaggio di errore:



int find(char* str, char x)
// cerca il carattere x nella stringa, ritorna l' indice, oppure -1 se
// tale carattere non è presente
{
int result=-1;
const int length=(int)strlen(str);
for(int i=0; i<length && result==-1; i++)
{
if(str[i]==x)
result=i;
}
return result;
}


Nel main puoi eseguire il controllo:



int index=find(nome1,'.');
if(index==-1 || index!= (strlen(nome1)-4) )
{
fprintf(stderr,"input non corretto");
exit(EXIT_FAILURE);
}


Nel tuo caso penso che il problema sia un input scorretto, se provi ad eseguire il codice digitando "pippo.txt" ti stampa come risultato "pippo.(meta).txt", non vedo problemi.
grazie per gli accorgimenti provvederò a sistemarlo :) però guarda che io inserisco correttamente prova.txt ad esempio e ricevo in output prova**(meta).txt con due caratteri indesiderati strano che a te il mio stesso codice non dia problemi

SpecialOne1992
26-04-2012, 15:25
Originariamente inviato da oregon
Direi che puoi provare così



char nome1[100],nome2[100];

printf("inserisci il nome del file\n");
scanf("%s",nome1);

int n=strlen(nome1)-4;
strncpy(nome2,nome1,n);
strncpy(nome2+n,"(meta)",6);
strcpy(nome2+n+6,nome1+n);

printf("file creato:%s\n",nome2);

grazie per il suggerimento.
sarei curioso di scoprire perché il mio codice non funziona in tutti i casi

oregon
26-04-2012, 16:08
Originariamente inviato da SpecialOne1992
grazie per il suggerimento.
sarei curioso di scoprire perché il mio codice non funziona in tutti i casi

Potresti cominciare con il controllare le parti che ho escluso/modificato rispetto al tuo codice.

Who am I
26-04-2012, 18:09
Originariamente inviato da SpecialOne1992
grazie per gli accorgimenti provvederò a sistemarlo :) però guarda che io inserisco correttamente prova.txt ad esempio e ricevo in output prova**(meta).txt con due caratteri indesiderati strano che a te il mio stesso codice non dia problemi

Se copio e incollo il tuo codice, lo compilo e lo eseguo, ottengo come output:



inserisci il nome del file
prova.txt
file creato:prova.(meta).txt
sh: pause: command not found


Strano no? :confused:
Comunque ho esaminato riga per riga il tuo codice, non mi pare ci siano errori.

PS: Su che sistema operativo compili?

SpecialOne1992
26-04-2012, 18:50
Originariamente inviato da Who am I
Se copio e incollo il tuo codice, lo compilo e lo eseguo, ottengo come output:



inserisci il nome del file
prova.txt
file creato:prova.(meta).txt
sh: pause: command not found


Strano no? :confused:
Comunque ho esaminato riga per riga il tuo codice, non mi pare ci siano errori.

PS: Su che sistema operativo compili?
infatti strano.. io compilo su windows 7 in macchina virtuale

SpecialOne1992
26-04-2012, 18:54
Originariamente inviato da oregon
Potresti cominciare con il controllare le parti che ho escluso/modificato rispetto al tuo codice.
si ho verificato..vorrei però capire dove sbaglia da me visto che il mio codice compilato da Who am I funziona correttamente :confused:

oregon
26-04-2012, 19:54
Originariamente inviato da SpecialOne1992
si ho verificato..vorrei però capire dove sbaglia da me visto che il mio codice compilato da Who am I funziona correttamente :confused:

Il problema è nella

nome2[100]

e da come è inizializzato il suo contenuto dal compilatore.

La stringa dovrebbe contenere caratteri casuali e in questo caso (come è stato quando ho provato), l'ultima

strcat(nome2,".(meta)");

aggiunge la stringa solo quando (casualmente) trova il NULL nella nome2 (fornendo risultati sballati).

Evidentemente (per caso o per configurazione del compilatore) durante la prova di Who am I la nome2 aveva in memoria il NULL come primo carattere e tutto andava bene.

Puoi provare semplicemente modificando la riga nel tuo programma così

char nome1[100],nome2[100]={0},temp[50];

Loading