-2
votes

C - Comment saisir et insérer une chaîne dans un tableau de cordes?

Je veux insérer une chaîne sur la matrice jusqu'à ce que je tape "ok". Pourquoi je reçois juste "OK" et une matrice originale à la sortie?

int main(void)
{
    char b[20];
    char* str[10] = { "1","2" };
    int i = 2;
    while (1) {

        gets(b);
        if (strcmp(b, "ok") == 0) break;
        str[i] = b;
        i++;
    }

    for (int j = 0; j < i; j++)
        printf("%s ", str[j]);
    return 0;
}


5 commentaires

Char * STR [10] est une matrice de Pointeurs . Vous stockez un pointeur au tampon d'entrée. Ils indiquent tous le tampon même . Par conséquent, ils indiquent tous les données d'entrée les plus récentes.


S'il vous plaît lire Pourquoi les obtiennent-ils fonction si dangereuse qu'il ne soit pas utilisé?


Le code comme celui-ci suggère que vous devez consacrer plus de temps à comprendre C chaînes et implications des pointeurs par rapport aux tableaux. C'est un bloc conceptuel que vous besoin d'avoir avant de pouvoir être efficace dans C. Il existe de nombreuses ressources, à la fois vidéo et imprimé, ce qui peut vous aider ici.


@tadman - J'avais l'habitude d'aimer le défi des chaînes de codage dans C. Je sais que C est une grande langue et qui mérite d'être appris et il existe des raisons historiques de la façon dont ses cordes fonctionnent. Aussi maintenant que j'ai eu Java et C # depuis si longtemps, je vois la vérité sur les cordes C - ils suce!


@FASTAL C était d'une époque où 100 kb de mémoire était un luxe, donc tout est super simple et beaucoup de responsabilité tombe au programmeur. Il est toujours pertinent dans certaines parties du monde intégré, mais c'est toujours super difficile à obtenir votre code C 100% correct. Beaucoup de projets C Open-Source C passent d'innombrables heures de traitement des problèmes de chaîne C, en particulier le risque sans fin de Bugs de débordement de tampon .


4 Réponses :


0
votes

Ils pointent tous sur B , qui sont remplacés dans chaque itération.


0 commentaires

0
votes

Vous devez attribuer une chaîne sur chaque itération: xxx


3 commentaires

tandis que (i> 2) libre (str [- i]);


@Weather Vane (Y)


Nathan Xabedi, curieux, pourquoi le inutile (Char *) Cast in B = (Char *) Malloc (20); ?



0
votes

Vous devez effectuer une copie de la chaîne d'entrée, puis enregistrez un pointeur sur la copie de la chaîne d'entrée dans votre tableau. Quelque chose comme: xxx


2 commentaires

Il serait préférable de lire l'entrée de l'utilisateur dans la matrice allouée. La copie est alors inutile.


Notez que si (* (B + SHLEN (B) -1) == '\ n') permet à un pirate de hackeur de causer des ub en ayant la première lettre entrée en tant que '\ 0' . Considérons B [strcspn (b, "\ n")] = 0; à la place.



0
votes

Vous devez créer une copie de la chaîne lorsque vous l'avez affecté: xxx

Vous pouvez également envisager d'utiliser fgets au lieu de obtient ; Toutefois, vous devrez supprimer la nouvelle ligne: xxx

également, imprimez une nouvelle ligne à la fin de votre programme, il ne gênera donc pas avec la coquille: xxx

Code complet: xxx


0 commentaires