la fusion des deux chaînes en C, la coupure de caractères
Je suis en train de fusionner les deux chaînes de caractères de longueur variable en C. Le résultat devrait être le 1er caractère de str1 puis le 1er caractère de str2 puis 2ème personnage de str1, 2e personnage de str2, etc. Quand il atteint la fin d'une chaîne, il doit ajouter le reste de l'autre de la chaîne.
Par Exemple:
str1 = "abcdefg";
str2 = "1234";
outputString = "a1b2c3d4efg";
Je suis assez nouveau à C, ma première idée a été de convertir les chaînes de tableaux puis essayez de parcourir les tableaux, mais je pensais qu'il pouvait être une méthode plus facile. Exemple de code serait appréciée.
Mise à JOUR:
J'ai essayé de mettre en œuvre la réponse ci-dessous. Ma fonction ressemble à la suivante.
void strMerge(const char *s1, const char *s2, char *output, unsigned int ccDest)
{
printf("string1 is %s\n", s1);
printf("string2 is %s\n", s2);
while (*s1 != 'void strMerge(const char *s1, const char *s2, char *output, unsigned int ccDest)
{
printf("string1 is %s\n", s1);
printf("string2 is %s\n", s2);
while (*s1 != '\0' && *s2 != '\0')
{
*output++ = *s1++;
*output++ = *s2++;
}
while (*s1 != '\0')
*output++ = *s1++;
while (*s2 != '\0')
*output++ = *s2++;
*output = '\0';
printf("merged string is %s\n", *output);
}
' && *s2 != 'void strMerge(const char *s1, const char *s2, char *output, unsigned int ccDest)
{
printf("string1 is %s\n", s1);
printf("string2 is %s\n", s2);
while (*s1 != '\0' && *s2 != '\0')
{
*output++ = *s1++;
*output++ = *s2++;
}
while (*s1 != '\0')
*output++ = *s1++;
while (*s2 != '\0')
*output++ = *s2++;
*output = '\0';
printf("merged string is %s\n", *output);
}
')
{
*output++ = *s1++;
*output++ = *s2++;
}
while (*s1 != 'void strMerge(const char *s1, const char *s2, char *output, unsigned int ccDest)
{
printf("string1 is %s\n", s1);
printf("string2 is %s\n", s2);
while (*s1 != '\0' && *s2 != '\0')
{
*output++ = *s1++;
*output++ = *s2++;
}
while (*s1 != '\0')
*output++ = *s1++;
while (*s2 != '\0')
*output++ = *s2++;
*output = '\0';
printf("merged string is %s\n", *output);
}
')
*output++ = *s1++;
while (*s2 != 'void strMerge(const char *s1, const char *s2, char *output, unsigned int ccDest)
{
printf("string1 is %s\n", s1);
printf("string2 is %s\n", s2);
while (*s1 != '\0' && *s2 != '\0')
{
*output++ = *s1++;
*output++ = *s2++;
}
while (*s1 != '\0')
*output++ = *s1++;
while (*s2 != '\0')
*output++ = *s2++;
*output = '\0';
printf("merged string is %s\n", *output);
}
')
*output++ = *s2++;
*output = 'void strMerge(const char *s1, const char *s2, char *output, unsigned int ccDest)
{
printf("string1 is %s\n", s1);
printf("string2 is %s\n", s2);
while (*s1 != '\0' && *s2 != '\0')
{
*output++ = *s1++;
*output++ = *s2++;
}
while (*s1 != '\0')
*output++ = *s1++;
while (*s2 != '\0')
*output++ = *s2++;
*output = '\0';
printf("merged string is %s\n", *output);
}
';
printf("merged string is %s\n", *output);
}
Mais je reçois un message d'avertissement lors de la compilation:
$ gcc -g -std=c99 strmerge.c -o strmerge
strmerge2.c: In function ‘strMerge’:
strmerge2.c:41:5: warning: format ‘%s’ expects argument of type ‘char *’, but argument 2 has type ‘int’ [-Wformat]
Et quand je le lance il ne marche pas:
./strmerge abcdefg 12314135
string1 is abcdefg
string2 is 12314135
merged string is (null)
Pourquoi il pense que l'argument 2 est un int et que dois-je faire pour être un char? Si je supprime le "*" off sortie dans le printf, il ne donne pas une erreur de compilation, mais la fonction ne fonctionne toujours pas.
- Alors, quel est votre problème?
- Un utilisateur tape dans les deux chaînes. J'ai besoin de retourner une chaîne unique qui est une fusion des deux chaînes.
- L'un de vos problèmes est la gestion de l'espace — où est la sortie va être placé. Avec ce fait, le code est assez simple. Bien que ni la chaîne d'entrée est terminé, copier un caractère de chacun à la sortie. Une fois qu'on est fini, vous avez deux boucles, l'une à l'échappement de la première chaîne et l'autre pour l'échappement de la deuxième chaîne. Un seul de ceux-ci seront exécutés (selon la chaîne la plus longue), mais ne vous embêtez pas à essayer de savoir qui il est; il n'y a pas besoin (en supposant que vous écrivez les boucles correctement).
- La sortie est mis dans un nouveau string et puis tout simplement imprimé à l'aide de printf. Le tampon de destination est de 128 caractères, mais la chaîne de destination ne doit jamais être plus grand que ça.
- L'erreur de compilation est parce que vous devez être l'impression
output
plutôt que*output
(qui est le premier caractère de la chaîne plutôt que la chaîne elle-même). Aussi,output
points à l'octet nul à la fin de la chaîne. Si vous souhaitez imprimer l'ensemble de la chaîne, vous devez préserver la valeur d'origine deoutput
à l'entrée de la fonction.
Vous devez vous connecter pour publier un commentaire.
Votre strMerge affiche null parce que, vous imprimez le valueAt(*)de sortie qui a été attribué null l'étape précédente.
Le code ci-dessous s'assure que les chaînes ne peuvent pas de débordement en faisant la chaîne de production tant que les deux chaînes d'entrée, et à l'aide de
fgets()
pour s'assurer qu'il n'y a pas de dépassement de capacité de la saisie de chaînes de caractères. Une conception alternative serait de faire de l'allocation de mémoire dynamique (malloc()
et al), au prix de la vocation du code defree()
l'espace alloué. Une autre conception de passer la longueur de la mémoire tampon de sortie de la fonction, afin qu'il puisse s'assurer qu'aucun dépassement de capacité se produit.Le programme de test n'émet pas d'invites: il ne serait pas difficile d'ajouter une fonction pour le faire.
Code
Exemple de sortie
const char *
puisque vous n'avez pas de modifier les chaînes d'entrée. Aussi, puisque vous savez où le dernier caractère a été placé, vous pouvez utiliserstrcpy()
au lieu destrcat()
, sans d'abord null de la fin de la chaîne. Aussi, vous ne voulez pas de copier l'ensemble destr1
oustr2
sur la chaîne; vous n'avez pas à allouer suffisamment d'espace pour que. À l'aide destrcpy()
enregistre rescanner la sortie, ce quistrcat()
doit faire lorsqu'il est invoqué comme vous le faites:if (str1[i] != '\0') strcpy(&str[k], &str1[i]); else if (str2[i] != '\0') strcpy(&str[k], &str2[i]);
.En C, les deux chaînes sont déjà des tableaux qui peuvent être accessibles par leur pointeurs. Vous avez juste besoin de créer un nouveau tampon qui est assez grande, puis copiez-y.
E. g. quelque chose comme ceci:
new
, mais il est nouvelles pour moi qu'il est présent dans C. MSVC peut confondre les choses par la compilation de la plupart de code C comme si c'était un compilateur C++...mais s'il vous plaît réécrire en pur C ou supprimer.