2009-10-08 11 views
1

J'apprends encore C et je vais avoir une certaine difficulté à comprendre comment gérer cela. Eh bien, j'ai deux: structDiviser une chaîne en parties plus petites et organiser une structure (C-programmation)

struct myStruct { 
    ... 
    struct myString *text[5]; 
    ... 
} allStructs; 

struct myString { 
    char part[100]; 
}; 

L'objectif est d'avoir allStruct[n] le point 5 différentes parties d'un texte divisé en lignes de 100 caractères chacun. Donc j'allouer l'espace:

allStructs = calloc(n, sizeof(allStructs)); 

Ensuite, supposons que j'ai rempli char text[500] que je veux diviser en 5 parties, et ont allStructs[n].text[n].part point une partie donnée du texte. Quelqu'un peut-il m'aider avec comment je procède?

Répondre

1

Réponse courte: vous ne pouvez pas avec cela parce que vous ne l'avez pas considérer le « \ 0 » de mettre fin à chaque chaîne.

Deuxième réponse: changement struct comme ça d'avoir plus de flexibilité:

struct myStruct { 
    struct myString *text; 
} 
struct myString { 
    char *part; 
} 

La répartition doit être:

struct myStruct *allStruct = calloc(n, sizeof(struct myStruct)); 

Vous avez donc un pointeur/tableau sur myStruct struct n.

initialiser ensuite tous les membres de allStruct;

for(i=0; i<n; ++i) 
{ 
    allStruct[i].text = calloc(5, sizeof(myString)); 
    // Following for only needed if you want new strings by using the strncpy (see above) 
    for(y=0; y<5; ++y) 
    { 
     allSTruct[i].text[y].part = calloc(101, sizeof(char)); 
    } 
} 

Vous avez maintenant tous les vars initialisés.

Pour copier vos 500 caractères longue chaîne en allStruct [n]:

for(i=0; i<5; i++) 
{ 
    allStructs[n].text[i].part = &text[i*100]; // If you want to point on the existing string 
    // OR 
    strncpy(allStructs[n].text[i].part, &text[i*100], 100); // If you want to have new strings 

    // In all case, terminate the string with '\0' 
    allStructs[n].text[i].part[100] = '\0'; 
} 

Cela devrait fonctionner.

+0

Cela semble prometteur! Merci Patrice. Je vais essayer et revenir à vous :) – o01

+0

Yup, a travaillé comme un charme!: D – o01

0

Eh bien, les chaînes c sont juste un tableau de caractères terminée par le caractère nul ('\0'). Donc, vous voudrez parcourir par le grand tableau text[500] en mettant 100 caractères dans chacune des parties . Gardez à l'esprit que puisque les chaînes c sont fermées à zéro, vous ne pourrez stocker que 99 caractères dans char part[100].

Aussi, si vous voulez mettre fin à une partie seulement sur un espace blanc (espace (' '), nouvelle ligne ('\n') ou onglet ('\t')) vous devez trouver le plus proche de la limite de 100 caractères et divisé la chaîne là-bas.

0

allStructs est un objet de type struct myStruct. Vous ne pouvez pas le "réaffecter" avec calloc().

Votre objet allStructs a le membre text qui est un tableau de 5 pointeurs.
Vous devez définir les pointeurs vers le point sur des objets spécifiques du type struct myString. Après avoir copié les caractères de char text[500] dans les différents objets struct myString, tout fonctionnera correctement.

code pseudo

struct myString part1; 
struct myString part2; 
struct myStruct allstructs; 
allStructs.text[0] = &part1; 
allStructs.text[1] = &part2; 
strncpy(part1.part, text, 99); 
part1.part[99] = '\0'; 

printf("part2: %s\n", allStructs.text[1].text); 

Oh! Et ne confondez pas allStructs (se termine par 's') avec allStruct (no 's')

Questions connexes