0
votes

Comment stocker des caractères dans un tableau à l'aide de pointeurs et de MALLOC?

Mon problème maintenant, c'est que j'ai pris de l'espace pour des mots différents, mais j'ai des problèmes de stocker cela comme une matrice. Même s'il y a des postes similaires comme celui-ci, rien ne semble travailler pour moi et je suis complètement coincé ici. Je veux garder ce format (je ne veux pas modifier la définition de la fonction). Reconnaissant pour toute aide et commentaires!

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



int i, len = 0, counter = 0;
char ** p = 0;

for(i = 0; s[i] != '\0'; i++){
    len++;

    if(s[i] == ' ' || s[i+1] == '\0'){

        counter ++;
 for(i = 0; i < len; i++){
    p[i] = s[i];
    }

}
printf("%d\n", len);
printf("%d\n", counter);
return p; 
}

int main() {
char *s = "This is a string";
int n;
int i;



for(i = 0; i < n*; i++){
 //also not sure how to print this 
}
}


4 commentaires

Vous pouvez envisager p pour être un tableau de pointeurs. Par conséquent, par exemple p [i] est un pointeur et p [i] = s [i] est faux car s [i] n'est pas un aiguille. En outre, vous ne devez pas utiliser le même index pour les deux P et s , puisque l'élément suivant à affecter dans p sera probablement pas la même chose que l'index du caractère actuel dans s . Et n'oubliez pas que Char Cordes en C est vraiment appelé NULL-TARNINÉ (BYTE) Strings , donc à moins que vous ne souhaitiez modifier la chaîne d'origine ( comme strtok fait) alors vous avez besoin Pour dupliquer une partie de la source


Il y a aussi beaucoup d'autres choses qui ne va pas avec votre code actuel, comme vous affectant la mémoire et réaffectant à P plusieurs fois, perdant la mémoire précédemment attribuée. Je vous suggère de vous asseoir avec un morceau de papier, d'écrire vos exigences, puis d'analyser les exigences en détail pour déterminer une conception à laquelle vous pourriez passer en œuvre de travail.


Votre code a des fautes de frappe et ne compile pas. Essayez de compiler avec -wall -werror -walltic -wsign-conversions -wshadow -wconversion -wunintialized -wextra


Vous passez n et n'utilisez jamais n .


4 Réponses :


0
votes

Voici une solution utilisant SSCANF. Scanf et SSCANF considèrent l'espace comme une fin d'entrée. J'ai profité de cela pour que cela fonctionne pour vous. XXX

Étant donné que ce pointeur se développe dans les dimensions, chaque fois qu'une nouvelle chaîne est trouvée, nous devons redimensionner le p lui-même puis la nouvelle adresse qu'il contient doit également être redimensionnée.


0 commentaires

0
votes

mon problème maintenant est que j'ai pris de l'espace pour des mots différents à l'aide de MALLOC, mais j'ai des problèmes de stocker cela comme une matrice. em>

quand adresse em> Pour une collection de chaînes est nécessaire, une collection de pointeurs, ainsi que la mémoire de chaque pointeur nécessaire. P>

Dans votre code: P>

char** split(const char* s, int *n){

    int i, len = 0, counter = 0, lenLongest = 0
    char ** p = 0;

    //code to count words and longest word

    p = Create2DStr(counter, longest + 1); //+1 for nul termination
    if(p)
    {
        //your searching code
        //...
        // when finished, free memory


0 commentaires

0
votes

Commençons par la logique.

Comment une chaîne est-elle comme un renard brun rapide. code> est traité? Je suggérerais: p>

  1. comptez le nombre de mots et la quantité de mémoire nécessaire pour stocker les mots. (En C, chaque chaîne se termine par un octet nul se terminant, \ 0 code>.) P> li>

  2. allouer suffisamment de mémoire pour les pointeurs et les mots. P> li>

  3. copier chaque mot de la chaîne source. p> li> ol>

    Nous avons une chaîne comme entrée, et nous voulons une gamme de chaînes comme sortie. L'option la plus simple est p> xxx pré>

    où la valeur de retour est null code> si une erreur se produit, ou une gamme de pointeurs terminés par un null pointeur sinon. Tout cela est alloué de manière dynamique à la fois, appelant gratuit () code> sur la valeur de retour libérera à la fois les pointeurs et leur contenu. P>

    commençons à mettre en œuvre la logique en fonction de la balle Points ci-dessus. p> xxx pré>

    Nous pouvons tester ce qui précède avec un petit test principal () code>: p> xxx pré>

    Si nous compilons et exécutions ce qui précède, nous obtenons p> xxx pré>

    la baisse de cette approche (d'utiliser un MALLOC () code> appel à allouer La mémoire pour les pointeurs et les données) est que nous ne pouvons pas facilement développer la matrice; Nous pouvons vraiment vraiment le traiter comme une grosse touffe. P>


    Une meilleure approche, surtout si nous entendons ajouter de nouveaux mots de manière dynamique, est d'utiliser une structure: P>

    wordarray  words = WORDARRAY_INIT;
    


1 commentaires

Wow. Merci pour une explication fantastique, cela a vraiment aidé et je comprends très bien maintenant!



0
votes

J'ai édité votre code et il fonctionne maintenant correctement: xxx

mais je vous suggère de faire un peu de nettoyage.


0 commentaires