Torna indietro   Hardware Upgrade Forum > Software > Programmazione

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.
Sony WF-1000X M6: le cuffie in-ear di riferimento migliorano ancora
Sony WF-1000X M6: le cuffie in-ear di riferimento migliorano ancora
WF-1000X M6 è la sesta generazione di auricolare in-ear sviluppata da Sony, un prodotto che punta a coniugare facilità di utilizzo con una elevata qualità di riproduzione dei contenuti audio e una cura nella riduzione del rumore ambientale che sia da riferimento
Snowflake porta l'IA dove sono i dati, anche grazie a un accordo con OpenAI
Snowflake porta l'IA dove sono i dati, anche grazie a un accordo con OpenAI
Snowflake ha presentato diverse novità per la sua piattaforma legate all'intelligenza artificiale. Quella forse più eclatante è una collaborazione con OpenAI, ma non mancano diverse nuove funzionalità che rendono la piattaforma più flessibile e in grado di rispondere meglio alle esigenze in continuo cambiamento delle aziende
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 28-05-2012, 13:26   #1
Baio84
Member
 
Iscritto dal: Apr 2012
Messaggi: 56
[C] Funzione fgets

Ho necessità di inserire una stringa. Utilizzando la funzione fgets ho notato che, nell'array in cui vado ad inserire la stringa, inserisce alla fine anche un carattere '\n'.
Quindi se dovessi inserire 'ciao', nel mio array troverei c i a o \n \0.

Per me è un problema perchè dopo dovrei inserire un'altra stringa nell'array ottenuto da fgets, tramite strcat, e quel newline lì mi provoca problemi seguenti.

C'è per caso una soluzione semplice al problema, ho devo "giocare" con la stringa per sostituire\eliminare il newline?
Baio84 è offline   Rispondi citando il messaggio o parte di esso
Old 28-05-2012, 15:35   #2
ESSE-EFFE
Member
 
Iscritto dal: May 2009
Messaggi: 186
Quote:
Originariamente inviato da Baio84 Guarda i messaggi
Ho necessità di inserire una stringa.

C'è per caso una soluzione semplice al problema, ho devo "giocare" con la stringa per sostituire\eliminare il newline?
Non ci capisce bene come tu debba "inserire" la stringa. Comunque, se ci pensi, vedrai che rimuovere quel "new line" in fondo alla stringa è una cosa semplice.
__________________
ESSE-EFFE.com
Sviluppo software e Web
Creazione loghi - Bergamo
ESSE-EFFE è offline   Rispondi citando il messaggio o parte di esso
Old 28-05-2012, 16:32   #3
Baio84
Member
 
Iscritto dal: Apr 2012
Messaggi: 56
Mi sono appena affaciato al C, per cui scusa per il mio linguaggio non proprio da programmatore.

Inserire nel senso che digito la frase su tastiera e tramite gets la inserisco nel vettore.

La soluzione diciamo che ce l'avevo già. Utilizzo una funzione specifica che ricerca \n nella stringa (strchr mi sembra), che mi restituisce la posizione del newline. Poi mi basterebbe porre vettore[posizione_newline] = '\0'.

In questo modo troverei alla fine della stringa due '\0'. Quello che volevo sapere è se questo modo possa andare bene. Per spiegarmi ancora meglio, siccome sono agli inizi, non volevo fare troppi giri con diverse funzioni, quando invece c'è n'è una che faccia al caso mio ma che non conosco ancora.

Ultima modifica di Baio84 : 28-05-2012 alle 16:50.
Baio84 è offline   Rispondi citando il messaggio o parte di esso
Old 28-05-2012, 16:54   #4
ESSE-EFFE
Member
 
Iscritto dal: May 2009
Messaggi: 186
Quote:
Originariamente inviato da Baio84 Guarda i messaggi
La soluzione diciamo che ce l'avevo già. Utilizzo una funzione specifica che ricerca \n nella stringa (strchr mi sembra), che mi restituisce la posizione del newline. Poi mi basterebbe porre vettore[posizione_newline] = '\0'.
Posta un po' di codice la prossima volta. Comunque in questo caso non serve "cercare" il newline. Se c'è, è l'ultimo carattere della stringa.

Quote:
Originariamente inviato da Baio84 Guarda i messaggi
In questo modo troverei alla fine della stringa due '\0'. Quello che volevo sapere è se questo modo possa andare bene.
Direi che non ci sono problemi.
__________________
ESSE-EFFE.com
Sviluppo software e Web
Creazione loghi - Bergamo
ESSE-EFFE è offline   Rispondi citando il messaggio o parte di esso
Old 28-05-2012, 18:51   #5
Baio84
Member
 
Iscritto dal: Apr 2012
Messaggi: 56
Hai ragione. Pensavo fosse un po' più semplice da svolgere, ma con un po' di codice ci si capisce meglio.

Codice:
if ( seconda_scelta == si )
	{
		sprintf (vecchionome, "%s", file->d_name);
		printf ( "vecchionome: %s\n", vecchionome );

		l = strlen ( vecchionome ) - 5;
		for ( i = 0; i < 5; i++ )
                {
                        estensione [i] = vecchionome [l];
                        l++;
                }

                printf ( "estensione: %s\n", estensione );
                fgets ( nuovonome, 80, stdin );
                printf ( "nuovonome: %s\n", nuovonome );
                newline = strlen ( nuovonome ) - 1;
                nuovonome [ newline ] = '\0';
                printf ( "estensione: %s\n", estensione );
		strcat ( nuovonome, estensione );
                printf ("nuovonome + estensione: %s\n", nuovonome);
                rinomina = rename (vecchionome, nuovonome);
                if ( rinomina == 0 )
                        printf ("File rinominato!");
                else
                        printf ("Errore");

                printf ("\n\n");
         }
Ecco qua. Ho risolto in questo modo. I tanti printf sono per controllare se tutto va bene.

Ultima modifica di Baio84 : 28-05-2012 alle 18:54.
Baio84 è offline   Rispondi citando il messaggio o parte di esso
Old 28-05-2012, 19:32   #6
ESSE-EFFE
Member
 
Iscritto dal: May 2009
Messaggi: 186
Quote:
Originariamente inviato da Baio84 Guarda i messaggi
Codice:
                fgets ( nuovonome, 80, stdin );
                printf ( "nuovonome: %s\n", nuovonome );
                newline = strlen ( nuovonome ) - 1;
                nuovonome [ newline ] = '\0';
Ecco qua. Ho risolto in questo modo. I tanti printf sono per controllare se tutto va bene.
fgets potrebbe anche non inserire il newline. Come dicevo nel mio precedente messaggio, se c'è, è l'ultimo carattere (ma non è detto che ci sia).
__________________
ESSE-EFFE.com
Sviluppo software e Web
Creazione loghi - Bergamo
ESSE-EFFE è offline   Rispondi citando il messaggio o parte di esso
Old 28-05-2012, 20:29   #7
Baio84
Member
 
Iscritto dal: Apr 2012
Messaggi: 56
Allora con un if penso di risolvere:

if ( strrchr ( nuovonome, '\n' ) )
{
newline = strlen ( nuovonome ) - 1;
nuovonome [ newline ] = '\0';
}

Devo dire che pensavo fosse più facile creare un programmino, anche semplice come questo, ma devo ammettere che ci si blocca spesso. Però è stimolante trovare le soluzioni per superare questi ostacoli!
Baio84 è offline   Rispondi citando il messaggio o parte di esso
Old 28-05-2012, 22:34   #8
Baio84
Member
 
Iscritto dal: Apr 2012
Messaggi: 56
Ecco qua il programma completo.
Posto il codice se qualcuno ha voglia di testarlo o magari ha qualche consiglio per ottimizzarlo.

Le uniche cose che al momento so che bisogna migliorare sono:
-la codifica: cioè i caratteri accentati non vengono stampati correttamente. Me la devo studiare bene;
-il riconoscimento tra file e cartelle. Viene effettuato se nel nome del file c'è un punto o meno. Questo va migliorato perchè ormai si possono avere quasi tutti i caratteri immaginabili, e se in una cartella è presente un punto, viene riconosciuta come file, creando anche problemi sulla sua rinomina.

Codice:
#include <stdio.h>
#include <unistd.h>
#include <dirent.h>
#include <string.h>

#define MAX_PATH 100

int main ()
{
	int l, rinomina, newline, punto = 0, g;
	char vecchionome [80], nuovonome [80], estensione [10];
	char dir [MAX_PATH], prima_scelta = '1', unpunto [] = ".", duepunti [] = "..", prog [] = "Programma rinominare.exe", seconda_scelta = 's', si = 's', no = 'n', uno = '1', due = '2';
	struct dirent *file;
	DIR *aperto;

	printf ( "%s\n%s\n\n",
		"Programma per rinominare file e cartelle.",
		"Verranno rinominati i file e le cartelle all'interno della cartella contenente il programma." );
    do
    {
        if ( prima_scelta != uno && prima_scelta != due )
            printf ( "Valore immesso non valido.\n" );
        printf ( "1 per cominciare a rinominare - 2 per uscire: " );
        scanf ( "%c", &prima_scelta );
        while ( getchar () != '\n' );
        printf ( "\n\n" );
    } while ( prima_scelta != uno && prima_scelta != due );


	if ( prima_scelta == uno )
	{
		printf ( "In caso di file, la loro estensione non verrà modificata.\n\n" );
		getcwd ( dir, MAX_PATH );
		aperto = opendir ( dir );
		while ( file = readdir ( aperto ))
		{
			if ( strcmp ( file->d_name, unpunto ) != 0 && strcmp ( file->d_name, duepunti ) != 0 && strcmp ( file->d_name, prog ) )
			{
                do
                {
                if ( seconda_scelta != si && seconda_scelta != no )
                    printf ( "Carattere immesso non valido.\n" );
                if ( strrchr ( file->d_name, '.' ) )
                    printf ( "File da rinominare: %s\n%s", file->d_name, "Rinominarlo? s = Sì, n = No  " );
                else
                    printf ( "Cartella da rinominare: %s\n%s", file->d_name, "Rinominarlo? s = Sì, n = No  " );
                scanf ( "%c", &seconda_scelta );
                while ( getchar () != '\n' );
                printf ( "\n" );
                } while ( seconda_scelta != si && seconda_scelta != no );

				if ( seconda_scelta == si )
				{
					printf ( "Inserisci il nuovo nome: " );
					sprintf (vecchionome, "%s", file->d_name);
                    for ( g = 0; g < 10; g++)
                        estensione [g] = '\0';
                    if ( strrchr ( vecchionome, '.' ) )
                    {
                        l = strlen ( vecchionome );
                        for ( g = l; vecchionome [g] != '.'; g-- )
                            punto++;
                        l -= punto;
                        for ( g = 0; g < punto; g++ )
                        {
                            estensione [g] = vecchionome [l];
                            l++;
                        }
                        punto = 0;
                    }
                    fgets ( nuovonome, 80, stdin );
                    if ( strrchr ( nuovonome, '\n' ) )
                    {
                        newline = strlen ( nuovonome ) - 1;
                        nuovonome [ newline ] = '\0';
                    }
					strcat ( nuovonome, estensione );
                    rinomina = rename (vecchionome, nuovonome);
                    if ( rinomina == 0 )
                        if ( strrchr ( nuovonome, '.' ) )
                            printf ("File rinominato in %s .", nuovonome);
                        else
                            printf ("Cartella rinominata in %s .", nuovonome);
                    else
                        printf ("Errore");
                    printf ("\n\n");
                }
                else
                    ;
            }
		}
		printf ( "Non ci sono più file da rinominare." );
		getchar ();
		return 0;
	}
	else
		return 0;
}
Baio84 è offline   Rispondi citando il messaggio o parte di esso
Old 29-05-2012, 09:29   #9
ESSE-EFFE
Member
 
Iscritto dal: May 2009
Messaggi: 186
Quote:
Originariamente inviato da Baio84 Guarda i messaggi
Allora con un if penso di risolvere:

if ( strrchr ( nuovonome, '\n' ) )
{
newline = strlen ( nuovonome ) - 1;
nuovonome [ newline ] = '\0';
}
Non ho guardato il programma completo, ma per verificare la presenza del newline puoi evitare la strrchr:

Codice:
pnewline = strlen(nuovonome) - 1;
if (nuovonome[pnewline] == '\n') nuovonome[pnewline] = '\0';
__________________
ESSE-EFFE.com
Sviluppo software e Web
Creazione loghi - Bergamo
ESSE-EFFE è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


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...
Sistema Mesh Roamii BE Pro: il Wi-Fi 7 secondo MSI Sistema Mesh Roamii BE Pro: il Wi-Fi 7 secondo M...
Recensione HUAWEI Mate X7: un foldable ottimo, ma restano i soliti problemi Recensione HUAWEI Mate X7: un foldable ottimo, m...
Hyundai: spunta un'elettrica estremament...
Una connessione diretta con AWS European...
La Toyota Yaris avrà una versione...
Minori sessualizzati da Grok: l'UE mette...
NIO stabilisce il nuovo record di scambi...
Dell Private Cloud sempre più ape...
Ennesimo incidente per la guida autonoma...
Dopo le maniglie, è il turno dei ...
Addio incendi incontrollati? Svolt dice ...
WINDTRE si mette in proprio: vender&agra...
The Mandalorian & Grogu: il trailer ...
OpenClaw sotto attacco: i malware infost...
Resident Evil Requiem: pre-load dal 25 f...
Vaticano, la Messa si traduce in 60 ling...
Kia prepara il facelift della Kia EV5: n...
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: 00:07.


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