2017-10-05 13 views
-2

Disons que j'ai un caractère * str et que je veux lui assigner des caractères un à la fois en utilisant des pointeurs et en l'incrémentant?Affectation de char à char * en utilisant des pointeurs

Je l'ai fait:

char *str; 
char c = 'a'; 
*str++ = c; 

Mais il ne fonctionne pas.

Comment puis-je faire cela?

+0

Fais quoi? Comprenez-vous * pourquoi * ça ne marche pas? –

+4

Cela ne fonctionne pas car 'str' ne pointe à rien de déterminé. Il n'y a pas de "là" là-bas. – WhozCraig

+2

J'aime la structure de la * Il n'y a pas "là" là. * Phrase ... –

Répondre

3

str est juste un pointeur. Il ne pointe pas n'importe où valide (surtout pas à un peu de mémoire que vous pourriez écrire). Une simple possibilité serait d'avoir pointer vers un tableau:

char buf[1024] = {0}; // room for 1024 chars (or 1023 + a 0 byte for a string) 
char *str = buf; 
char c = 'a'; 
*str++ = c; 
2

char *str est un pointeur sur un char (ou un tableau de caractères), mais vous ne l'avez affecté. Comme cela a été mentionné plus haut, un char * dit essentiellement "allez-y" mais il n'y a pas là-bas, vous ne lui avez jamais donné une valeur. Vous devez d'abord utiliser malloc pour créer un espace pour mettre les choses en. Voici un exemple

char *str = malloc(sizeof(char)*10) //allocate space for 10 chars 
char c = 'a'; 
str[0] = c; 

aucune vérification d'erreur a été faite à malloc que vous devez faire dans votre propre programme. Vous pouvez aussi le faire en tant que tels

char str[10]; 
char c = 'a'; 
str[0] = c; 

mais avec cette méthode, vous serez limité à 10 caractères et vous ne pouvez pas modifier ce montant, avec la méthode précédente, vous pouvez utiliser realloc pour obtenir un espace plus ou moins dans votre tableau.

1

Mais cela ne fonctionne pas.

char* str; 

... n'est pas initialisées à quoi que ce soit, déréférencement il est donc à un comportement non défini. Si elle est initialisée, alors dans l'expression *str++ = c; str ++ est un opérateur de post-incrémentation, qui renvoie une copie du pointeur tout en incrémentant l'original. L'effet est que la copie pointe vers le précédent, et donc ce qui est pointé par le pointeur précédent est assigné c.

À quelle partie cela ne fonctionne pas, parlez-vous?

EDIT:

Comme mentionné dans l'un des commentaires, une copie est pas vraiment retourné, mais la valeur est incrément en place après avoir été évalué.

+1

Il ne "retourne pas de copie". L'opérateur '++' modifie l'objet (dans ce cas le pointeur) en place. Il * évalue * à la valeur * avant * d'incrémenter. –

+0

@FelixPalmen, dans le cas des types intégrés, c'est vrai, oui, mais j'aime conceptualiser c'est en l'expliquant comme pour les non-builtins –

+0

Ceci est C. Il n'y a pas d'opérateurs surchargés (utilisateur). –

1

En tant que variable avec durée de stockage automatique, le pointeur str a une valeur indéterminée. Si même il avait la durée de stockage statique, sa valeur serait NULL. Vous ne pouvez donc pas utiliser un tel pointeur pour stocker des données.

Qu'est-ce que vous voulez dire peut regarder par exemple la façon suivante

#include <stdio.h> 

int main(void) 
{ 
    char s[11]; 

    char *p = s; 

    while (p != s + sizeof(s)/sizeof(*s) - 1) *p++ = 'a'; 
    *p = '\0'; 

    puts(s); 

    return 0; 
} 

La sortie du programme est

aaaaaaaaaa 

Ici, dans le programme, le pointeur p du type char * est initialisé par l'adresse du premier caractère du tableau s.

Ainsi cette instruction utilisée dans la boucle

*p++ = 'a'; 

remplit successivement le tableau avec le caractère 'a'.

L'exemple suivant est plus intéressant

#include <stdio.h> 

char * copy_string(char *dsn, const char *src) 
{ 
    for (char *p = dsn; (*p++ = *src++) != '\0';) 
    { 
     // empty body 
    } 

    return dsn; 
} 

int main(void) 
{ 
    char *src = "Hi QBl"; 
    char dsn[7]; 

    puts(copy_string(dsn, src)); 

    return 0; 
} 

La sortie du programme est

Hi QBl 

Voici une démonstration d'une fonction qui copie un tableau de caractères contenant une chaîne dans un autre tableau de caractères en utilisant des pointeurs.