Programmation en C d'impression tableau de caractères
J'ai un tableau de caractères déclaré:
char *array[size];
Lorsque j'effectue une
printf("%s", array);
il me donne des caractères binaires, pourquoi il en est ainsi?
http://www.cplusplus.com/reference/clibrary/cstdio/printf/
Cette url indique printf prend dans le format: int printf ( const char * format, ... );
#include <stdio.h>
#include <string.h>
#define size 20
#define buff 100
char line[buff];
int main ()
{
char *array[100];
char *sep = " \t\n";
fgets(line, buff, stdin);
int i;
array[0] = strtok(line, sep);
for (i = 1; i < size; i++) {
array[i] = strtok(NULL, sep);
if (array[i] == NULL)
break;
}
return 0;
}
- C'est un tableau de pointeurs, pas de caractères.
Vous devez vous connecter pour publier un commentaire.
Votre tableau n'est pas initialisé, et aussi que vous avez un tableau de pointeurs, au lieu d'un tableau de char. Il devrait être
char* array = (char*)malloc(sizeof(char)*size);
, si vous voulez un tableau de char. Maintenant, vous avez un pointeur vers le premier élément du tableau.new
n'est pas un opérateur dansC
Vous déclarez un tableau de caractères comme suit:
Vous semblez avoir tout mélangé avec
char *
, qui est un pointeur sur un caractère. On pourrait direqui ferait
bar
point sur le contenu defoo
. (Ou, en fait, le premier caractère defoo
.)Pour ensuite imprimer le contenu du tableau, vous pouvez effectuer l'une des opérations suivantes:
Noter, cependant, que C n'effectue aucune initialisation du contenu des variables, de sorte que si vous définissez le contenu de quelque chose, vous obtiendrez des ordures. En outre, si cette poubelle n'arrive pas à contenir un
\0
; c'est un char avec la valeur 0, cela permettra de tenir sur la sortie après la fin du tableau.&foo
est de typechar(*)[size]
: il n'est pas vraiment compatible avecchar*
, le type debar
. Vouschar *bar = foo;
Pourquoi faisons-nous une chose toute simple son de si difficile?
La char dans tableau après la fin de ce que vous souhaitez pour votre chaîne (c'est à dire. si vous voulez que votre chaîne à lire "Bonjour", ce qui pourrait être le prochain char après le "o") doit être appelé à disparaître caractère NUL '\0'. Si vous utilisez une fonction C pour lire l'entrée qui sera automatiquement ajouté à la fin de votre tampon. Vous n'aurez qu'à vous soucier de le faire manuellement si vous avez été individuellement l'écriture des caractères à votre tampon ou quelque chose pour une raison quelconque.
EDIT: Comme avec pmg commentaire, le '\0' accompagne partout où vous voulez le chaîne à la fin, donc si vous voulez réduire votre chaîne, vous pourriez juste le déplacer plus près de l'avant, soit à une chaîne vide vous avez juste
array[0] = '\0';
. Cela peut également être utilisé pour tokenise petites chaînes de caractères dans un tampon unique, tout comme strtok n'. c'est à dire. "Part1\0Part2\0Part3\0". Mais je pense que c'est s'éloigner de la portée de la question.ie. vous avez voulu pour stocker les 3 premiers caractères de l'alphabet comme une chaîne de caractères (je ne sais pas pourquoi quelqu'un voudrait faire de cette façon, mais c'est juste un exemple):
Si vous avez quelque chose comme
char array[] = "Hello";
le '\0' est ajouté automatiquement pour vous.printf(array)
ne pas "imprimer la chaîne comme est". C' interprète la chaîne provoquant un Comportement indéterminé il contient toutes les spécifications de conversion. Utilisationprintf("%s", array)
à la place.char foo[7] = "foo\0bar";
---foo[6]
est'r'
;puts(foo);
sorties"foo\n"
array
n'est pas unchar *
avec qui, il est de plus en plus comme unchar **
(pointeur vers un tableau de caractères, avec est similaire à pointeur de pointeur de char).Si vous avez besoin d'une chaîne C, soit:
et assurez-vous de 0-de le terminer correctement, ou
et assurez-vous de bien répartir et de stockage gratuit pour elle (et 0 à la fin de trop).
printf
fera que si vous lui passez unchar*
et l'utilisation de la%s
spécificateur de format. MAIS si votre chaîne ne prend pas fin avec un0
(ce n'est pas un pointeur, c'est un char), il va aller sur et imprimer tout ce qui est stocké dans la mémoire après votre chaîne, provoquant un comportement indéfini.