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;
}
4 Réponses :
Ils pointent tous sur B code>, qui sont remplacés dans chaque itération. P>
Vous devez attribuer une chaîne sur chaque itération:
tandis que (i> 2) libre (str [- i]); code>
@Weather Vane (Y)
Nathan Xabedi, curieux, pourquoi le inutile (Char *) Code> Cast in B = (Char *) Malloc (20); Code>?
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:
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') code> permet à un pirate de hackeur de causer des ub en ayant la première lettre entrée en tant que '\ 0' code>. Considérons B [strcspn (b, "\ n")] = 0; code> à la place.
Vous devez créer une copie de la chaîne lorsque vous l'avez affecté: Vous pouvez également envisager d'utiliser également, imprimez une nouvelle ligne à la fin de votre programme, il ne gênera donc pas avec la coquille: p > Code complet: p> fgets code> au lieu de obtient code >; Toutefois, vous devrez supprimer la nouvelle ligne: p>
Char * STR [10] CODE> est une matrice de Pointeurs i>. Vous stockez un pointeur i> au tampon d'entrée. Ils indiquent tous le tampon même i>. 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 i> 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 i> 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 i>.