2017-02-27 4 views
2

Ceci est la section spécifique du code où je suis confronté à des problèmes en utilisant à la fois les fonctions strcat() et strncat() pour concaténer deux chaînes.Quelle est une autre alternative aux fonctions strcat et strncat dans C?

La fonction strcat() est déclarée comme char *strcat(char *dest, const char *src) et strncat() comme char *strncat(char *dest, const char *src, size_t n), mais les deux leur donner des problèmes lorsque le second paramètre est un caractère de chaîne, à savoir, qui ne se termine pas avec '\0'. J'ai besoin de concaténer le caractère à une chaîne.

Y a-t-il une alternative à ces deux fonctions ou existe-t-il un moyen de faire fonctionner ces fonctions?

char *cipher_str = (char *)malloc(sizeof(char) * 26); 
    for (int j = 0; j < col; j++) { 
     for (int i = 0; i < col; i++) { 
      if (min == cipher[0][i] && (done[i] != 1)) { 
       done[i] = 1; 
       for (int k = 0; k < rows; k++) 
        strcat(cipher_str, cipher[i][k]); 
       } 
      } 
      ... 
+0

S'il vous plaît fournir la définition de 'cipher'. –

+5

Pour seulement ajouter un seul caractère, vous pouvez utiliser 'int l = strlen (s); s [l] = ch; s [l + 1] = 0; '(à condition que vous ayez suffisamment d'espace alloué pour s) – Ctx

+0

@PaulOgilvie char cipher [rows] [col]; –

Répondre

3

Th chemin est ici plus simple d'ajouter le caractère « manuellement » à la chaîne, par exemple:

int m=0; 

    .... 
     cipher_str[m++]=cipher[i][k]; 
    .... 
    cipher_str[m]='\0'; 
+0

Merci! la solution a fonctionné! –

2

Puisque vous utilisez strcat pour ajouter 1 caractère, vous pouvez utiliser cette fonction.

void strcat(char* dest, char src) 
{ 
    int size; 
    for(size=0;dest[size]!='\0';++size); 
    dest[size]=src; 
    dest[size+1]='\0'; 
} 

Et vous avez dit que vous avez « \ 0 » à la fin de votre « cipher_str », je l'ai utilisé pour déterminer la longueur.

0

Quelle est une autre alternative aux fonctions strcat et strncat dans C?

Le code en ligne peut bien fonctionner avec size_t m comme avec @Paul Ogilvie réponse.

Comme autonomes fonctions:

char *strcat_c(char *s, char c) { 
    size_t len = strlen(s); 
    s[len++] = c; 
    s[len] = '\0'; 
    return s; 
} 

char *strncat_c(char *s, char c, size_t n) { 
    char sc[2] = { c, '\0' }; 
    return strncat(s, sc, n); 
} 

// or with C11 compound literals 

char *strncat_c(char *s, char c, size_t n) { 
    return strncat(s, (char [2]) { c, '\0' }, n); 
} 
0

convertir le seul charbon en une chaîne de longueur 1, puis utiliser strcat()

#include <string.h> 

void appendchar(char *x, char y) { 
    char z[2]; 
    z[0] = y; 
    z[1] = 0; 
    strcat(x, z); 
} 

char data[1000] = "foo"; 
appendchar(data, 'b'); 
appendchar(data, 'a'); 
appendchar(data, 'r'); 
puts(data); 

prendre garde déborde tampon

0

Il y a plusieurs problèmes avec votre code:

  • cipher_str AFFECTÉ avec malloc(), il est donc non initialisée. La transmettre comme la chaîne de destination pour strcat() a un comportement indéfini car elle ne contient pas de chaîne correcte. Passer un char comme deuxième argument à strcat est incorrect.

  • Si vous insistez sur l'utilisation d'une fonction pour ajouter un seul char, vous pouvez écrire:

    char *cipher_str = calloc(26); 
    for (int j = 0; j < col; j++) { 
        for (int i = 0; i < col; i++) { 
         if (min == cipher[0][i] && done[i] != 1) { 
          done[i] = 1; 
          for (int k = 0; k < rows; k++) 
           strncat(cipher_str, &cipher[i][k], 1); 
          } 
         } 
         ... 
    

Mais il est exagéré d'appeler une fonction pour cette tâche simple et vous ne cochez pas si cipher_str est assez long.

Voici une solution beaucoup plus simple avec une variable d'index:

char *cipher_str = (char *)malloc(sizeof(char) * 26); 
int ii = 0; 
for (int j = 0; j < col; j++) { 
    for (int i = 0; i < col; i++) { 
     if (min == cipher[0][i] && (done[i] != 1)) { 
      done[i] = 1; 
      for (int k = 0; k < rows; k++) { 
       if (ii < 25) { 
        cipher_str[ii++] = cipher[i][k]; 
       } else { 
        // cipher_str is too short for the job. 
       } 
      } 
     } 
     cipher_str[ii] = '\0'; 
     ...