GCC ne renvoie aucune erreur ou avertissement. Le programme se sépare après avoir entré un mot de passe de plus de 21 caractères. Au début, j'eu:Signal SIGSEGV reçu: vfprintf.c: Aucun fichier ou répertoire de ce type?
hash_p = SuperFastHash(query.pwd, strlen(query.pwd));
obtenir cet avertissement GCC:
warning: assignment makes pointer from integer without a cast [-Wint- conversion]
hash_p = SuperFastHash(query.pwd, strlen(query.pwd));
^
donc je l'ai changé:
sprintf(hash_p, "%d", SuperFastHash(query.pwd, strlen(query.pwd)));
parce que la fonction de hachage retourne un entier. strcmp compare deux type const char *.
Lorsque je déboguer le programme en utilisant gdb, il retourne ceci:
Program received signal SIGSEGV, Segmentation fault.
0xb7e500d5 in _IO_vfprintf_internal (s=<optimized out>, format=<optimized out>,
ap=0xbffff46c "\261\[email protected]") at vfprintf.c:1636
1636 vfprintf.c: No such file or directory.
Programme:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <stdarg.h>
#include <stdint.h>
#define BUF_SIZE 1024
#undef get16bits
#if (defined(__GNUC__) && defined(__i386__)) || defined(__WATCOMC__) \
|| defined(_MSC_VER) || defined (__BORLANDC__) || defined (__TURBOC__)
#define get16bits(d) (*((const uint16_t *) (d)))
#endif
#if !defined (get16bits)
#define get16bits(d) ((((uint32_t)(((const uint8_t *)(d))[1])) << 8)\
+(uint32_t)(((const uint8_t *)(d))[0]))
#endif
uint32_t SuperFastHash (const char * data, int len) {
uint32_t hash = len, tmp;
int rem;
if (len <= 0 || data == NULL) return 0;
rem = len & 3;
len >>= 2;
for (;len > 0; len--) {
hash += get16bits (data);
tmp = (get16bits (data+2) << 11)^hash;
hash = (hash << 16)^tmp;
data += 2*sizeof (uint16_t);
hash += hash >> 11;
}
switch (rem) {
case 3: hash += get16bits (data);
hash ^= hash << 16;
hash ^= ((signed char)data[sizeof (uint16_t)]) << 18;
hash += hash >> 11;
break;
case 2: hash += get16bits (data);
hash ^= hash << 11;
hash += hash >> 17;
break;
case 1: hash += (signed char)*data;
hash ^= hash << 10;
hash += hash >> 1;
}
hash ^= hash << 3;
hash += hash >> 5;
hash ^= hash << 4;
hash += hash >> 17;
hash ^= hash << 25;
hash += hash >> 6;
return hash;
}
struct log_n {
char uid[BUF_SIZE];
char pwd[BUF_SIZE];
};
struct log_n acc[1] = {
"username","-1257730142"
};
struct log_n query;
int main() {
char *hash_p;
do {
do{
printf("Username: ");
fgets(query.uid, sizeof query.uid, stdin);
query.uid[strcspn(query.uid, "\n")] = '\0';
if (strlen(query.uid) < 4) {
printf("Username must be between four and eight characters.\nTry again.\n");
}
if (strlen(query.uid) > 8) {
printf("Username must be less than eight characters.\nTry again.\n");
}
} while (strlen(query.uid) < 4 || strlen(query.uid) > 8);
do{
printf("Password: ");
fgets(query.pwd, sizeof query.pwd, stdin);
query.pwd[strcspn(query.pwd, "\n")] = '\0';
sprintf(hash_p, "%d", SuperFastHash(query.pwd, strlen(query.pwd)));
if (strlen(query.pwd) < 21) {
printf("Password must be atleast twenty-one characters long.\nTry again.\n");
}
} while (strlen(query.pwd) < 21);
} while (strcmp(query.uid, acc->uid) !=0 || strcmp(hash_p, acc->pwd) !=0);
}
Note: ce n'est pas un devoir. Je suis juste une personne qui apprend C avec l'aide de personnes qui utilisent Internet.
Il est bon de remarquer que ce n'est pas un devoir, mais il est bon de savoir que nous sommes vraiment heureux de répondre à vos questions ici. Si c'était pour les devoirs, ce serait encore sur le sujet: vous avez un problème clairement énoncé, avec un effort préalable évident, et les gens sont heureux d'aider dans de tels cas. Les questions de devoirs que nous décourageons sont là où il n'y a pas d'effort, ou l'auteur de la question aimerait que quelqu'un les aide à tricher. – halfer