Compilatore zombie???

di il
10 risposte

Compilatore zombie???

Salve a tutti,ho compilato questo programma per cercare una stringa in un file ma con esito negativo.
La stringa incriminata è if(persons.lastName == name) che non risulta mai vera anche se le parola combaciano.
#include <stdio.h>
void displayBit(char *value);
typedef struct person {
	char lastName[15];
	char firstName[15];
	char age[4];
} Person;

int main() {
	
	char name[15];
	FILE *namePtr;
	
	Person persons = {"", "", "0"};

	gets(name);  //ho provato anche con scanf
	displayBit(name);  //verifico la stringa in binario
	
	if(!(namePtr = fopen("nameage.dat", "rb+")))
		printf("Non posso aprire nameage.dat\n");
	else {
		while(!feof(namePtr)){
			fread( &persons, sizeof(Person), 1, namePtr);
			displayBit(persons.lastName);  //verifico la stringa in binario
			if(persons.lastName == name) {    //parte incriminata
				printf("Nome trovaro\n");
				break;
			}
			else
				printf("non trovato\n");
		}

}
	return 0;
}
void displayBit(char *value) {
	
	size_t c = (8 * sizeof(char)) * 10;
	unsigned displayMask = 1 << 8, i;
	
	for (i = 0; c > 0; c--) {
		putchar(value[i] & displayMask ? '1' : '0');
		value[i] <<= 1;
		
		if (c % 8 == 1) {
			putchar(' ');
			i++;
		}	
	}
	putchar('\n');
}
cosa potrebbe essere secondo voi.

10 Risposte

  • Re: Compilatore zombie???

    
    gets(name);  //ho provato anche con scanf
    
    Usa fgets
    http://en.cppreference.com/w/c/io/fget
    oppure (se il compilatore supporta gli ultimi standard)
    gets_s
    http://en.cppreference.com/w/c/io/get

    In quel modo confronti solo gli indirizzi dei puntatori, non cosa puntano.
    Il confronto tra stringhe ASCIIZ si fa con strcpy o con la versione sicura strncpy
    http://en.cppreference.com/w/c/string/byt
  • Re: Compilatore zombie???

    Giusto, dovevo usare la strcmp
    grazie
  • Re: Compilatore zombie???

    Ma prima di parlare di problemi di un compilatore, non servirebbe imparare a programmare con il linguaggio ?
  • Re: Compilatore zombie???

    Il confronto tra stringhe ASCIIZ si fa con strcpy o con la versione sicura strncpy
    Quando si dice mai postare prima di colazione...
  • Re: Compilatore zombie???

    shodan ha scritto:


    Il confronto tra stringhe ASCIIZ si fa con strcpy o con la versione sicura strncpy
    Quando si dice mai postare prima di colazione...
    Beh, considerando che la Regina Bianca in "Through the looking-glass" del reverendo Charles Dodgson (meglio noto come Lewis Carroll, e in compenso assai poco noto come matematico) riusciva a credere fino a sei cose incredibili prima di colazione...

    Quoto comunque appieno il nostro ottimo Oregon: il titolo della discussione (e soprattutto l'attitudine mentale dalla quale simili titoli possono scaturire) è certamente da modificare.
  • Re: Compilatore zombie???

    Si è vero,scusatemi sono un autodidatta e sono alle prime armi, abbiate pazienza

    ho un altro problema,nella funzione searchName quando cancello il record dal file mi cancella quello successivo, la fread prima acquisisce i dati e li immagazzina nella variabile di struttura e poi passa il puntatore al record successivo, invece dovrei cancellare il record precedente.
    #include <stdio.h>
    #include <string.h>
    
    void inizializza(FILE *fPtr);
    void insertName(FILE *fPtr);
    void searchName(FILE *fPtr);
    
    typedef struct person {
    	char lastName[15];
    	char firstName[15];
    	char age[4];
    } Person;
    
    int main() {
    
    	FILE *namePtr;
    	char *s = "Premi 1 per inizialiizare,2 per inserire nomi, 3 per cercare, 0 per uscire: ";
    	int i;
    	
    	printf("%s", s);
    	fscanf(stdin, "%d%*c", &i);
    
    	while(i) {
    		switch(i) {
    			case 1:
    				inizializza(namePtr);
    				break;
    			case 2:
    				insertName(namePtr);
    				break;
    			case 3:
    				searchName(namePtr);
    		}
    	printf("%s", s);
    	fscanf(stdin, "%d%*c", &i);
    	}
    	return 0;
    }
    
    void inizializza(FILE *fPtr) {
    
    	int i;
    
    	Person blankpersons = {"unassigned", "", "0"};
    
    	if(!(fPtr = fopen("nameage.dat", "wb")))
    		printf("Non posso creare nameage.dat\n");
    	else {
    		for (i = 0; i < 100; i += 1)
    			fwrite( &blankpersons, sizeof(struct person), 1 , fPtr);
    		}
    		fclose(fPtr);
    }
    
    void insertName(FILE *fPtr) {
    
    	Person persons = {"", "", ""};
    	
    	if((fPtr = fopen("nameage.dat", "rb+"))) {
    		fscanf(stdin, "%s%s%s", persons.lastName, persons.firstName, persons.age);
    		while(!feof(stdin)) {
    			fwrite( &persons, sizeof(Person), 1, fPtr);
    			fscanf(stdin, "%s%s%s", persons.lastName, persons.firstName, persons.age);
    		}
    	}
    	fclose(fPtr);
    }
    
    void searchName(FILE *fPtr) {
    
    	char name[15], s = 's';
    	int i = 0;
    	Person persons = {"", "", ""};
    	Person blankpersons = {"unassigned", "", "0"};
    
    	if((fPtr = fopen("nameage.dat", "rb+"))) {
    		printf("Inserisci il nome: ");
    		fscanf(stdin, "%s%*c", name);
    		
    		while(!feof(fPtr)) {
    			fread( &persons, sizeof(Person), 1, fPtr);
    			if(!strcmp(persons.lastName, name)) {
    				printf("Trovato, vuoi cancellare il record? S/n: ");
    				fscanf(stdin, "%c", &s);
    				i++;
    				if( s == 's' || s == 'S') {
    					fwrite( &blankpersons, sizeof(Person), 1, fPtr);
    				break;
    				}
    			}
    		}
    	}
    	if(i)
    		printf("No info\n");
    }
    come posso ovviare al problema?
  • Re: Compilatore zombie???

    Dopo che fai una fread sposti il puntatore al prossimo record e ovviamente la fwrite avviene nel prossimo record.

    Quando fai la fread e trovi il record, PRIMA della fwrite devi tornare indietro con il puntatore tramite una fseek
  • Re: Compilatore zombie???

    oregon ha scritto:


    Dopo che fai una fread sposti il puntatore al prossimo record e ovviamente la fwrite avviene nel prossimo record.

    Quando fai la fread e trovi il record, PRIMA della fwrite devi tornare indietro con il puntatore tramite una fseek
    adesso ci sono riuscito
    fseek(fPtr, ftell(fPtr) - sizeof(Person), SEEK_SET)
    prima mettevo SEEK_CUR

    tnx
  • Re: Compilatore zombie???

    Nella funzione
    void insertName(FILE *fPtr) {
    
    	Person persons = {"", "", ""};
    	
    	if((fPtr = fopen("nameage.dat", "rb+"))) {
    		fscanf(stdin, "%s%s%s", persons.lastName, persons.firstName, persons.age);
    		while(!feof(stdin)) {
    			fwrite( &persons, sizeof(Person), 1, fPtr);
    			fscanf(stdin, "%s%s%s", persons.lastName, persons.firstName, persons.age);
    		}
    	}
    	fclose(fPtr);
    }
    quando inserisco prima nomi lunghi tipo albert einstein 76 e poi inserisco anna rossi 20 dopo col comando cat nameage.dat noto che i nomi del secondo record (anna rossi 20)si accavallano col primo annaert rossiein 20.
    Perché succede?
  • Re: Compilatore zombie???

    I dati numerici sono memorizzati in binario, non puoi usare cat che tratta solamente file di testo in formato ASCII.
Devi accedere o registrarti per scrivere nel forum
10 risposte