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

[C] Aiuto stringhe

  1. #1
    ROOT01 non è in linea Novello
    Post
    4
    Like Inviati  
    0
    Like Ricevuti  
    0
    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:
    #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
    Post
    17,513
    Blogs
    6
    Like Inviati  
    6
    Like Ricevuti  
    36
    Il penultimo for deve essere

    	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.
    ℹ️ Leggi di più su AntonioG ...

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

    	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
    Post
    17,513
    Blogs
    6
    Like Inviati  
    6
    Like Ricevuti  
    36
    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 ...
    ℹ️ Leggi di più su AntonioG ...

  5. #5
    ROOT01 non è in linea Novello
    Post
    4
    Like Inviati  
    0
    Like Ricevuti  
    0
    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.
    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 messaggio

Potrebbero interessarti anche ...

  1. Aiuto con sostituzione stringhe
    Da Ghostman nel forum PHP
    Risposte: 14
    Ultimo Post: 05-11-2011, 23:58
  2. Risposte: 4
    Ultimo Post: 27-11-2009, 13:53
  3. aiuto! Errore nel file DFM con stringhe lunghe
    Da Maxinforum1967 nel forum Delphi
    Risposte: 0
    Ultimo Post: 03-03-2008, 08:05
  4. Stringhe... HELP...
    Da Dami7 nel forum Visual Basic 6
    Risposte: 5
    Ultimo Post: 14-06-2004, 14:27
  5. Stringhe
    Da lucagalbu nel forum Visual Basic 6
    Risposte: 6
    Ultimo Post: 23-04-2004, 22:36