+ Rispondi al Thread
Visualizzazione dei risultati da 1 a 5 su 5

Discussione: [C] Aiuto stringhe

  1. #1
    ROOT01 non è in linea Novello
    Post
    4

    [C] Aiuto stringhe

    salve a tutti sto scrivendo un programma che data in input una data 17/08/2017 la converta in 17 agosto 2017.
    Il problema è che per i mesi di lunghezza 8(febbraio, noevmbre, dicembre) alla fine aggiunge un '. ES:
    Inserire la data nel formato gg/mm/aaaa
    11/12/2017
    11 dicembre 2017`
    L'altro problema è che rimangono nella stringa carattere vecchi. ES:
    Inserire la data nel formato gg/mm/aaaa
    jhhjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj
    La data deve essere nel formato gg/mm/aaaa
    Inserire la data nel formato gg/mm/aaaa
    11/09/2017
    11 settembre 2017jjjjjjjjjjjjjjjjjjjjjjjjj
    Potrei aver già postato questa domanda e mi scuso perchè sono nuovo. spero di non aver infranto qualche regola, il codice è il seguente:
    codice:
    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>
    #define DIM 30
    #define FALSE 0
    #define TRUE 1	
    
    void inputDato(char*);
    void conversione(char*, int);
    
    int main() {
    	char data[DIM+1];
    	inputDato(data);
    	conversione(data, DIM);
    	system("pause");
    	return 0;
    }
    
    void inputDato(char*stringa){
    	int i=0, j=TRUE, l=FALSE;
    	do {
    		printf("Inserire la data nel formato gg/mm/aaaa\n");
    		gets(stringa);
    		for (i=0; i<strlen(stringa); i++)
    		{ 
    			if (stringa[i] != '0' &&
    				stringa[i] != '1' &&
    				stringa[i] != '2' &&
    				stringa[i] != '3' &&
    				stringa[i] != '4' &&
    				stringa[i] != '5' &&
    				stringa[i] != '6' &&
    				stringa[i] != '7' &&
    				stringa[i] != '8' &&
    				stringa[i] != '9' &&
    				i != 2 && i != 5 && 
    				i != 3)
    			{
    				printf("La data deve essere nel formato gg/mm/aaaa\n");
    				j = TRUE;
    				break;
    			}
    			// controllo /	
    			else if ((i == 2 || i == 5) && stringa[i] == '/')
    				j = FALSE;
    			// controllo mese
    			else if (i == 3)
    			{
    				if (stringa[i] == '0')
    					j = FALSE;
    				else if (stringa[i] == '1' && (stringa[4] == '1' || stringa[4] == '2' || stringa[4] == '0'))
    					j = FALSE;
    				else {
    					j = TRUE;
    					printf("Mese inserito non valido\n");
    					break;
    				}
    			}
    			//controllo giorno
    			else if (i ==0){
    				if (stringa[i] == '1' || stringa[i] == '2')
    					j = FALSE;
    				else if (stringa[i] == '3' && stringa[i+1] < '2')
    					j = FALSE;
    				else{
    					j = TRUE;
    					printf("Giorno inserito non valido\n");
    					break;	
    				}
    			}
    			else 
    				j = FALSE;
    		}
    	}	while(j);
    }
    
    void conversione(char*stringa, int dim){
    	int i;
    	char mese[11];
    	stringa[2]= ' ';
    	stringa[5]= ' ';
    	if (stringa[3] == '0' && stringa[4] == '1')
    		strcpy(mese, "gennaio");
    	else if (stringa[3] == '0' && stringa[4] == '2')
    		strcpy(mese, "febbraio");
    	else if (stringa[3] == '0' && stringa[4] == '3')
    		strcpy(mese, "marzo");
    	else if (stringa[3] == '0' && stringa[4] == '4')
    		strcpy(mese, "aprile");
    	else if (stringa[3] == '0' && stringa[4] == '5')
    		strcpy(mese, "maggio");
    	else if (stringa[3] == '0' && stringa[4] == '6')
    		strcpy(mese, "giugno");
    	else if (stringa[3] == '0' && stringa[4] == '7')
    		strcpy(mese, "luglio");
    	else if (stringa[3] == '0' && stringa[4] == '8')
    		strcpy(mese, "agosto");
    	else if (stringa[3] == '0' && stringa[4] == '9')
    		strcpy(mese, "settembre");
    	else if (stringa[3] == '1' && stringa[4] == '0')
    		strcpy(mese, "ottobre");
    	else if (stringa[3] == '1' && stringa[4] == '1')
    		strcpy(mese, "novembre");
    	else if (stringa[3] == '1' && stringa[4] == '2')
    		strcpy(mese, "dicembre");
    	for (i=0; i<5; i++)
    		stringa[strlen(mese)+7-i] = stringa[9-i];
    	for (i=0; i<strlen(mese); i++)
    		stringa[3+i] = mese[i];
    	printf("%s\n", stringa);
    }

  2. #2
    L'avatar di AntonioG
    AntonioG non è in linea Moderatore Globale Ultimo blog: Commodore 64 e Codemotion
    Luogo
    Roma
    Post
    16,158
    Blogs
    5
    Il penultimo for deve essere

    codice:
    	for (i=0; i<6; i++)
    		stringa[strlen(mese)+8-i] = stringa[10-i];
    perché devi tener conto anche del carattere terminatore della stringa posto dopo l'anno.
    Come saprai le stringhe del C sono terminate da carattere \0 obbligatorio che devi gestire tu in questi casi.
    Avvisi generali e importanti, a pena CHIUSURA thread e/o BAN
    Il crossposting è vietato.
    Le richieste di "pappa pronta" sono vietate.
    Utilizzate i tag CODE per il codice.
    Leggere il Regolamento per chiarimenti PRIMA di creare nuovi thread.
    Utilizzare sempre i PM per comunicare con i moderatori.
    Non mi contattate in PM per problemi di software, usate il forum

  3. #3
    ROOT01 non è in linea Novello
    Post
    4
    Quote Originariamente inviato da AntonioG Visualizza il messaggio
    Il penultimo for deve essere

    codice:
    	for (i=0; i<6; i++)
    		stringa[strlen(mese)+8-i] = stringa[10-i];
    perché devi tener conto anche del carattere terminatore della stringa posto dopo l'anno.
    Come saprai le stringhe del C sono terminate da carattere \0 obbligatorio che devi gestire tu in questi casi.
    grazie mille Antonio sono agli inizi e a volte faccio errori abbastanza banali.
    Se non è un problema potresti darmi qualche dritta sul mio codice?

  4. #4
    L'avatar di AntonioG
    AntonioG non è in linea Moderatore Globale Ultimo blog: Commodore 64 e Codemotion
    Luogo
    Roma
    Post
    16,158
    Blogs
    5
    In effetti dovresti modificare parecchie parti.

    Tanto per cominciare, per identificare il mese, dovresti convertire il valore stringa dei due caratteri del mese in numerico e usarlo come indice in un vettore di stringhe costanti contenenti il nome del mese.

    char *arrMesi = { "Gennaio", "Febbraio", ....};

    e quindi

    arrMesi[valMese]

    sarebbe la stringa da aggiungere con il nome del mese, senza quelle mille if ...
    Avvisi generali e importanti, a pena CHIUSURA thread e/o BAN
    Il crossposting è vietato.
    Le richieste di "pappa pronta" sono vietate.
    Utilizzate i tag CODE per il codice.
    Leggere il Regolamento per chiarimenti PRIMA di creare nuovi thread.
    Utilizzare sempre i PM per comunicare con i moderatori.
    Non mi contattate in PM per problemi di software, usate il forum

  5. #5
    ROOT01 non è in linea Novello
    Post
    4
    Quote Originariamente inviato da AntonioG Visualizza il messaggio
    In effetti dovresti modificare parecchie parti.

    Tanto per cominciare, per identificare il mese, dovresti convertire il valore stringa dei due caratteri del mese in numerico e usarlo come indice in un vettore di stringhe costanti contenenti il nome del mese.

    char *arrMesi = { "Gennaio", "Febbraio", ....};

    e quindi

    arrMesi[valMese]

    sarebbe la stringa da aggiungere con il nome del mese, senza quelle mille if ...
    Scusa ma intendevi qualcosina del genere?Mi è stato detto di evitare di utilizzare il break/continue con l' if/else perché rende il codice più difficile da leggere, tu cosa ne pensi?Dovrei modificare l'inputdato?
    Ti riporto solamente la funzione (il prgramma funziona perfettamente) grazie ancora antonio.
    codice:
    void conversione(char*stringa, int dim){
    	int i, valMese;	
    	char *mese[] = {"Gennaio", "Febbraio", "Marzo", "Aprile", 
    				    "Maggio", "Giugno", "Luglio", "Agosto", 
    				    "Settembre", "Ottobre", "Novembre", "Dicembre", "\0"};
    	char d[3];
    	d[0]=stringa[3];
    	d[1]=stringa[4];	
    	valMese = atoi(d)-1;
    	stringa[2]= ' ';
    	stringa[5]= ' ';
    	for (i=0; i<6; i++)
    		stringa[strlen(mese[valMese])+8-i] = stringa[10-i];
    	for (i=0; i<strlen(mese[valMese]); i++)
    		stringa[3+i] = mese[valMese][i];
    	printf("%s\n", stringa);
    }

+ Rispondi al Thread

Tag per questa discussione

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi