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 Réponses :
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. É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 code> lui-même puis la nouvelle adresse qu'il contient doit également être redimensionnée. p> p>
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
Commençons par la logique.
Comment une chaîne est-elle comme 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, allouer suffisamment de mémoire pour les pointeurs et les mots. P> li>
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> où la valeur de retour est commençons à mettre en œuvre la logique en fonction de la balle Points ci-dessus. p> Nous pouvons tester ce qui précède avec un petit test Si nous compilons et exécutions ce qui précède, nous obtenons p> la baisse de cette approche (d'utiliser un Une meilleure approche, surtout si nous entendons ajouter de nouveaux mots de manière dynamique, est d'utiliser une structure: P> un renard brun rapide. code> est traité? Je suggérerais: p>
\ 0 code>.) P> li>
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> principal () code>: p> 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>
wordarray words = WORDARRAY_INIT;
Wow. Merci pour une explication fantastique, cela a vraiment aidé et je comprends très bien maintenant!
J'ai édité votre code et il fonctionne maintenant correctement: mais je vous suggère de faire un peu de nettoyage. p> p>
Vous pouvez envisager
p code> pour être un tableau de pointeurs. Par conséquent, par exemplep [i] code> est un pointeur etp [i] = s [i] code> est faux cars [i] code> n'est pas un aiguille. En outre, vous ne devez pas utiliser le même index pour les deuxP code> ets code>, puisque l'élément suivant à affecter dansp code> sera probablement pas la même chose que l'index du caractère actuel danss code>. Et n'oubliez pas queChar code> Cordes en C est vraiment appelé NULL-TARNINÉ (BYTE) Strings i>, donc à moins que vous ne souhaitiez modifier la chaîne d'origine ( commestrtok code>fait) alors vous avez besoin Pour dupliquer une partie de la sourceIl 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 code> 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 code>Vous passez
n code> et n'utilisez jamaisn code>.