Je voudrai créer un programme qui va recevoir une chaine de caractères en ligne de commande et afficher chaque caractère de la dite chaine sur une ligne. Exemple "Hello" => H-e-l-l-o ou H e l l o
J'aimerai :
- option 1 utiliser le nom de la chaine pour la parcourir
- option 2 utiliser un pointeur
Voici le code sur lequel je travaille :
#include <stdio.h>
#include<string.h>
#include<stdlib.h>
int main(int argc, char * argv[]) {
if (argc < 2) {
fprintf(stderr, "manipuler arg\n => Il faut un argument\n");
exit(0);
}
int limit = strlen(argv[1]) - 1;
#ifndef POINTEUR
int i = 0;
puts("Affichage 1 :");
while (i < limit)
printf("%c - ", argv[1][i++]);
printf("%c\n", argv[1][i]);
#endif
#ifdef POINTEUR
puts("Affichage 2 :");
char * p = argv[1];
while (limit--)
printf("%c - ", * p++);
printf("%c\n", * p);
#endif
return 0;
}
Ton code semble fonctionner, tu bloques sur quoi ?
Avec le pointeur tu peux tester le caractère nul '\0' de fin de chaîne pour l'arrêt de la boucle ce qui évite d'utiliser la taille de la chaîne (limit).
J'ai fait un copier-coller de ton code et je l'ai testé. Ton code semble fonctionner dans chacun des deux modes. Dans l'exemple, il n'y a pas d'espace de chaque côté du '-', vérifies ton format ("%c - "). Autre chose, si tu as une chaîne du genre: je suis le diable Le premier paramètre sera seulement je Il faut placer la phrase entre des " " "je suis le diable"
ce qui est ravissant, mais ne fait pas tout à fait le boulot.
---
Pour que ça marche avec les lettres accentuées et tout ça, il faut analyser la chaîne, pour déterminer les octets qui commencent le codage d'un caractère.
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
/*
Avec utf8, les caractères Unicode sont codés
- soit sur un octet (pour ceux qui correspondent au code US-ASCII 7 bits)
- soit sur une séquence de 2, 3 ou 4
Dans le premier cas, le bit de gauche de l'octet est à 0
Pour les autres cas
- le premier octet commence par 110, 1110 ou 11110
selon que c'est une séquence de 2, 3, ou 4 octets
- les octets suivants commencent par 10
*/
bool is_ascii_char(char c)
{
return (c & 0x80) == 0;
}
bool is_first_byte(char c)
{
// le premier octet d'une séquence commence par 11
return (c & 0xC0) == 0xC0;
}
void utf8_spacing(const char *string)
{
printf("utf8\t");
char *spacing = "";
for (const char *p = string; *p != '\0'; p++) {
if (is_ascii_char(*p) || is_first_byte(*p)) {
printf("%s", spacing);
spacing = " ";
}
printf("%c", *p);
}
printf("\n");
}
void eight_bit_spacing(const char *string)
{
printf("8bit\t");
char *delimiter = "";
for (const char *p = string; *p != '\0'; p++) {
printf("%s%c", delimiter, *p);
delimiter = " ";
}
printf("\n");
}
int main(int argc, char *argv[])
{
printf("Spacings\n");
for (int i = 1; i < argc; i++) {
printf("string\t\"%s\"\n", argv[i]);
eight_bit_spacing(argv[i]);
utf8_spacing(argv[i]);
}
return EXIT_SUCCESS;
}
Exécution,
$ ./prog "bientôt l'été"
Spacings
string "bientôt l'été"
8bit b i e n t � � t l ' � � t � �
utf8 b i e n t ô t l ' é t é
- Edité par michelbillaud 26 avril 2023 à 12:00:17
Chaine de caractères en ligne de commande
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
Le Tout est souvent plus grand que la somme de ses parties.