2012-08-23 2 views
2

J'essaie de créer un tableau de caractères composé de quelques lettres et chiffres (la fonction était beaucoup plus complexe au début, mais j'ai continué à la simplifier pour comprendre pourquoi cela ne fonctionne pas correctement). J'ai donc un tableau char dans lequel j'ai mis 2 caractères, et j'essaie d'y ajouter quelques chiffres. Pour une raison que je ne peux pas comprendre, les nombres ne sont pas ajoutés au tableau. C'est peut-être vraiment stupide mais je suis nouveau en C alors voici le code simplifié. Toute aide est très appréciée, merci!Essayer de mettre des chiffres dans un tableau char

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

char some_string[20]; 

char *make_str() { 
    some_string[0] = 'a'; 
    some_string[1] = 'x'; 
    int random = 0; 
    int rand_copy = 0; 
    random = (rand()); 
    rand_copy = random; 
    int count = 2; 
    while (rand_copy > 0) { 
    rand_copy = rand_copy/10; 
    ++count; 
    } 
    int i=2; 
    for (i=2; i<count; i++) { 
    some_string[i] = random%10; 
    random = random/10; 
    } 
    return (some_string); 
}  

int main(int argc, const char *argv[]) { 
    printf("the string is: %s\n",make_str()); 
    return 0; 
} 
+0

Tout nombre inférieur à 32 (si je me souviens bien) correspondent à un omble chevalier non imprimable – Saphrosit

+0

@axesdenied histoire courte sur les personnages: il n'y a pas des choses telles que lettres un ordinateur. Tout est des nombres binaires. Le type de caractère ne fait pas exception. Lorsque vous écrivez 'some_string [0] = 'a';' vous êtes en train d'écrire 'some_string [0] = 97;', le littéral de caractères est plus facile à lire qu'un nombre ASCII brut. 'random% 10' donne un nombre compris entre 0 et 9. Les chiffres ASCII ont des nombres compris entre 48 ('0') et 57 ('9'). En tapant + '0' ici, vous voulez dire en fait "donnez-moi un nombre aléatoire entre 0-9, puis ajoutez 48", ce qui équivaut à "donnez-moi un nombre aléatoire entre 48 et 57. – Lundin

Répondre

2

Vous avez de nombreux problèmes:

  1. chaîne résultante est zéro TERMINAISON. Ajouter some_string[i] = '\0'; pour corriger ce
  2. caractère (char) est quelque chose comme « une lettre », mais random % 10 produit un nombre (int) qui, lorsqu'il est converti en résultats de caractères dans le code de contrôle (caractères ASCII 0-9 sont des codes de contrôle). Vous feriez mieux d'utiliser some_string[i] = (random % 10) + '0';
  3. vous utilisez une chaîne de longueur fixe (20 caractères), ce qui peut suffire, mais cela pourrait entraîner de nombreux problèmes. Si vous êtes un débutant et que vous n'avez pas appris l'allocation dynamique de la mémoire, c'est ok pour l'instant. Mais rappelez-vous que les tampons de longueur fixe sont l'une des 10 principales raisons du code C buggé. Et si vous devez utiliser des tampons de longueur fixe (il y a des raisons légitimes de le faire), ALLWAYS vérifie si vous ne débordez pas le tampon. Utilisez des constantes prédéfinies pour la longueur du tampon. Sauf si le but de votre exercice est d'essayer de convertir des nombres en chaînes, utilisez la fonction libc comme snprintf pour imprimer quoi que ce soit dans une chaîne.
  4. ne pas utiliser la variable globale (some_string) et si vous le faites (c'est correct pour un petit exemple), il est inutile de retourner cette valeur.

légèrement meilleure version:

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

#define BUF_LENGTH 20 
char some_string[BUF_LENGTH]; 

char *make_str() { 
    some_string[0] = 'a'; 
    some_string[1] = 'x'; 
    int random = rand(); 
    int rand_copy = random; 
    int count = 2; 
    while (rand_copy > 0) { 
     rand_copy = rand_copy/10; 
     ++count; 
    } 
    int i; 
    for (i = 2; i < count; i++) { 
     /* check for buffer overflow. -1 is for terminating zero */ 
     if (i >= BUF_LENGTH - 1) { 
      printf("error\n"); 
      exit(EXIT_FAILURE); 
     } 
     some_string[i] = (random % 10) + '0'; 
     random = random/10; 
    } 
    /* zero-terminate the string */ 
    some_string[i] = '\0'; 
    return some_string; 
}  

int main(int argc, const char *argv[]) { 
    printf("the string is: %s\n",make_str()); 
    return 0; 
} 
+0

" les tampons de longueur fixe sont un »Les fuites de mémoire dynamique sont encore plus haut sur cette liste de 10. Les tampons statiques avec leur taille définie après une activité cérébrale par le programmeur sont tout à fait sûrs. et les contrôles de santé mentale présents dans le programme, comme il se doit – Lundin

+0

Etre fixe n'a rien à voir avec l'allocation de mémoire Vous pouvez écrire aussi facilement 'char * buf [20];' que vous pouvez écrire 'char * buf = (char *) malloc (20); ' –

+0

Cela a tout à voir avec l'allocation de mémoire, puisque les tableaux statiques ne peuvent pas avoir une longueur variable (à moins qu'ils ne soient des VLAs) .Btw vous vouliez probablement dire 'char buf [20];' char * buf = malloc (20); '. – Lundin

Questions connexes