2015-12-17 2 views
0

J'ai écrit un programme qui tente de "deviner" un mot en choisissant au hasard des caractères. Cependant, mon programme imprime des caractères qui ne figurent pas dans ma liste de caractères. Qu'est-ce qui se passe ici?caractères aléatoires dans c

#include <stdio.h> 
#include <stdlib.h> 
#include <time.h> 
#include <string.h> 

int main(){ 

    int index, i; 
    time_t t; 
    char characters[] = "bdefgir"; 
    char word[] = "friedberg"; 
    srand((unsigned)time(&t)); 
    char result[9] = {0}; 

    while(strcmp(result, word) != 0){ 

     for (i = 0; i < 9; i++) { 
      index = rand() % 8; 
      result[i] = characters[index]; 
     } 
     printf("Result:\t%s\n", result); 

    } 

    return 0; 

} 
+3

Votre 'result' n'est pas nul fin après l'avoir rempli; 'strcmp' et' printf ("% s", ...) 'attendent des srings à terminaison nulle. Faire «résultat» 10 caractères de long. –

+0

Ou modifiez% s en% .9s – James

+0

En outre, votre code peut choisir le caractère de terminaison NULL de 'characters', qui a 7 caractères, mais qui a la taille 8: 7 caractères plus un terminateur null. Choisir le nul peut être voulu, mais je suppose que vous ne voulez que choisir parmi les sept lettres du pool de caractères. –

Répondre

2

votre variable mal orthographié wort il devrait être word. Aussi, vous devez avoir result tableau contenant 9 caractères (comme votre mot "friedberg") et se terminant par un caractère '\0' (donc le nombre total de caractères est en fait 10).

La bonne solution serait:

#include <stdio.h> 
#include <stdlib.h> 
#include <time.h> 
#include <string.h> 

int main() { 

    int index, i; 
    time_t t; 
    char characters[] = "bdefirg"; 

    char word[] = "friedberg"; 

    srand((unsigned) time(&t)); 
    char result[10]; 
    result[9] = '\0'; 

    while (strcmp(result, word) != 0) { 

     for (i = 0; i < 9; i++) { 
      index = rand() % 7; 
      result[i] = characters[index]; 
     } 
     printf("Result:\t%s\n", result); 

    } 

    return 0; 

} 
+0

Les lettres sont répétées plusieurs fois dans le 'résultat 'en utilisant le générateur de nombres par défaut. Par exemple, obtenir des numéros de rand à partir de/dev/urandom sur des systèmes * nix + étendre un tableau de caractères pour dupliquer des caractères qui sont dupliqués dans le mot d'origine rendrait les choses plus rapides. – Keammoort

+0

@chux Je pense que vous avez raison, j'ai enlevé cette partie de ma réponse. – Keammoort

+0

qui a résolu le problème merci, mais il faut encore trop longtemps pour correspondre au mot, pool de caractères serait une solution je suppose – Sparkm4n