98 votes

Comment copier un tableau de chars en C ?

En C, j'ai deux tableaux de chars :

char array1[18] = "abcdefg";
char array2[18];

Comment copier la valeur de array1 a array2 ? Puis-je simplement faire ceci : array2 = array1 ?

4voto

Boris Points 21

Ça devrait ressembler à ça :

void cstringcpy(char *src, char * dest)
{
    while (*src) {
        *(dest++) = *(src++);
    }
    *dest = '\0';
}
.....

char src[6] = "Hello";
char dest[6];
cstringcpy(src, dest);

2voto

akhil Points 732

Je recommande d'utiliser memcpy() pour copier les données. De plus, si nous assignons un tampon à un autre comme array2 = array1 Les deux tableaux ont la même mémoire et tout changement dans le tableau 1 se répercute dans le tableau 2. Mais si nous utilisons memcpy, les deux tampons ont des tableaux différents. Je recommande memcpy() parce que strcpy et les fonctions connexes ne copient pas le caractère NULL.

1voto

MOHAMED Points 11753
array2 = array1;

n'est pas supporté en c. Vous devez utiliser des fonctions comme strcpy() pour le faire.

1voto

Les fonctions c ci-dessous seulement ... c++ vous devez faire un tableau de chars puis utiliser une copie de chaîne de caractères puis utiliser les fonctions de tokenizor de chaîne de caractères ... c++ a rendu beaucoup plus difficile de faire quoi que ce soit

#include <iostream>
#include <fstream>
#include <cstring>
#define TRUE 1
#define FALSE 0
typedef int Bool;
using namespace std;
Bool PalTrueFalse(char str[]);
int main(void)
{
char string[1000], ch;
int i = 0;
cout<<"Enter a message: ";

while((ch = getchar()) != '\n') //grab users input string untill 
{                               //Enter is pressed
    if (!isspace(ch) && !ispunct(ch)) //Cstring functions checking for
    {                                //spaces and punctuations of all kinds
        string[i] = tolower(ch); 
        i++;
    }
}
string[i] = '\0';  //hitting null deliminator once users input
cout<<"Your string: "<<string<<endl; 
if(PalTrueFalse(string)) //the string[i] user input is passed after
                        //being cleaned into the null function.
    cout<<"is a "<<"Palindrome\n"<<endl;
else
   cout<<"Not a palindrome\n"<<endl;
return 0;
}

Bool PalTrueFalse(char str[])
{
int left = 0;
int right = strlen(str)-1;
while (left<right)
{
   if(str[left] != str[right]) //comparing most outer values of string
       return FALSE;          //to inner values.
   left++;
   right--;
}
return TRUE;
}

1voto

madmurphy Points 101

Eh bien, techniquement, tu peux

typedef struct { char xx[18]; } arr_wrap;

char array1[18] = "abcdefg";
char array2[18];

*((arr_wrap *) array2) = *((arr_wrap *) array1);

printf("%s\n", array2);     /* "abcdefg" */

mais ce ne sera pas très beau.

A moins que vous n'utilisiez le préprocesseur C

#define CC_MEMCPY(DESTARR, SRCARR, ARRSIZE) \
    { struct _tmparrwrap_ { char xx[ARRSIZE]; }; *((struct _tmparrwrap_ *) DESTARR) = *((struct _tmparrwrap_ *) SRCARR); }

Vous pouvez alors le faire :

char array1[18] = "abcdefg";
char array2[18];

CC_MEMCPY(array2, array1, sizeof(array1));

printf("%s\n", array2);     /* "abcdefg" */

Et cela fonctionnera avec n'importe quel type de données, pas seulement char :

int numbers1[3] = { 1, 2, 3 };
int numbers2[3];

CC_MEMCPY(numbers2, numbers1, sizeof(numbers1));

printf("%d - %d - %d\n", numbers2[0], numbers2[1], numbers2[2]);     /* "abcdefg" */

(Oui, le code ci-dessus est accordé pour travailler toujours et c'est portable)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X