Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11
  1. #1

    [c] scrivere dentro una stringa

    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
    codice:
    #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;
    }

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Direi che puoi provare così

    codice:
    	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);
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Utente bannato
    Registrato dal
    Apr 2012
    Messaggi
    510

    Re: [c] scrivere dentro una stringa

    Alcune considerazioni:

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

    codice:
    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:

    codice:
    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:

    codice:
    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.

  4. #4

    Re: Re: [c] scrivere dentro una stringa

    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ì:

    codice:
    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:

    codice:
    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:

    codice:
    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

  5. #5
    Originariamente inviato da oregon
    Direi che puoi provare così

    codice:
    	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

  6. #6
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    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.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  7. #7
    Utente bannato
    Registrato dal
    Apr 2012
    Messaggi
    510

    Re: Re: Re: [c] scrivere dentro una stringa

    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:

    codice:
    inserisci il nome del file
    prova.txt
    file creato:prova.(meta).txt
    sh: pause: command not found
    Strano no?
    Comunque ho esaminato riga per riga il tuo codice, non mi pare ci siano errori.

    PS: Su che sistema operativo compili?

  8. #8

    Re: Re: Re: Re: [c] scrivere dentro una stringa

    Originariamente inviato da Who am I
    Se copio e incollo il tuo codice, lo compilo e lo eseguo, ottengo come output:

    codice:
    inserisci il nome del file
    prova.txt
    file creato:prova.(meta).txt
    sh: pause: command not found
    Strano no?
    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

  9. #9
    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

  10. #10
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    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
    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];
    No MP tecnici (non rispondo nemmeno!), usa il forum.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.