2013-05-15 5 views
3

Folks, besoin de rechercher dans un tableau de caractères et remplacer toute occurrence de '+', '/' ou '=' par '% 2B', '% 2F' et '% 2F' 'respectivementC remplacer char dans le tableau char

variable base64output ressemble

FtCPpza+Z0FASDFvfgtoCZg5zRI= 

Code

char *signature = replace_char(base64output, "+", "%2B"); 
signature = replace_char(signature, "/", "%2F"); 
signature = replace_char(signature, "=", "%3B"); 

char replace_char (char *s, char find, char replace) { 
    while (*s != 0) { 
     if (*s == find) 
     *s = replace; 
     s++; 
    } 
    return s; 
} 

(erreurs) sur avec

s.c:266: warning: initialization makes pointer from integer without a cast 

Qu'est-ce que je fais de mal? Merci!

+0

Quel est le type de 'base64output'? –

+4

Cela ne fonctionnera pas. Vous essayez d'insérer 3 caractères dans un seul 'char', qui est UB. –

+0

@ RichardJ.RossIII je vois ça! comment dois-je écrire cela alors? – Cmag

Répondre

5

Si le problème est que vous avez des ordures dans votre variable de signature:

void replace_char(...) est incompatible avec signature = replace_char(...)

Edit:

Oh, je ne l'ai pas vu ... Ce ne va pas travaillez depuis que vous essayez de remplacer un char par un tableau de caractères sans aucune allocation de mémoire.

Vous devez allouer un nouveau morceau de mémoire (malloc) suffisamment grand pour contenir la nouvelle chaîne, puis copier la source 's' vers la destination, en remplaçant 'c' par 'replace' si nécessaire.

Le prototype doit être: char *replace_char(char *s, char c, char *replace);

+0

....comment dois-je réparer? :) – Cmag

+0

ah, char au lieu de vide! – Cmag

+0

J'ai mis à jour le code ci-dessus, est-ce mieux? – Cmag

1

votre signature retourne replace_charvoid

void replace_char (char *s, char find, char replace) 

Mais, lorsque l'éditeur de liens tente de résoudre les éléments suivants

signature = replace_char(signature, "=", '%3B'); 

Il ne trouve pas fonction qui est appelée replace_char et renvoie int (int est la valeur par défaut s'il y a pas de prototype).

Modifiez le prototype de fonction replace_char pour qu'il corresponde à l'instruction.

EDIT: L'avertissement que votre fonction retourne char, mais vous l'utilisez comme char * aussi, votre fonction ne retourne rien, vous devez retourner quelque chose? Il semble que vous ne compreniez pas vraiment le code avec lequel vous travaillez. La correction des erreurs et des avertissements sans comprendre exactement ce que vous devez faire ne vaut rien ..

+0

s.c: 266: warning: l'initialisation fait un pointeur d'entier sans une distribution – Cmag

+0

Qu'est-ce que cela veut dire? – stdcall

+0

@Clustermagnet J'ai édité ma réponse – stdcall

2

Vous pourriez passer un peu de temps à discuter des différentes façons de le faire.

Remplacement d'un seul caractère est simple - boucle à travers, si cela correspond, remplacer ancien et le nouveau, etc.

Le problème ici est que la longueur de la partie « nouveau » est plus longue que la longueur de l'ancien . Une méthode consisterait à déterminer la longueur de la nouvelle chaîne (en comptant les caractères), et soit (1) essayer de le faire en place, soit (2) allouer une nouvelle chaîne.

est ici une idée # 1:

int replace(char *buffer, size_t size, char old, const char *newstring) 
{ 
    size_t newlen = strlen(newstring); 
    char *p, *q; 
    size_t targetlen = 0; 

    // First get the final length 
    // 
    p = buffer; 
    while (*p) 
    { 
     if (*p == old) 
     targetlen += newlen; 
     else 
     targetlen++; 
     ++p; 
    } 

    // Account for null terminator 
    // 
    targetlen++; 

    // Make sure there's enough space 
    // 
    if (targetlen > size) 
     return -1; 

    // Now we copy characters. We'll start at the end and 
    // work our way backwards. 
    // 
    p = buffer + strlen(buffer); 
    q = buffer + targetlen; 

    while (targetlen) 
    { 
     if (*p == old) 
     { 
     q -= newlen; 
     memcpy(q, newstring, newlen); 
     targetlen -= newlen; 
     --p; 
     } 
     else 
     { 
     *--q = *p--; 
     --targetlen; 
     } 
    } 

    return 0; 
} 

Ensuite, vous pouvez l'utiliser de cette façon (est ici un test rapide je l'ai fait):

char buf[4096] = "hello world"; 

if (replace(buf, sizeof(buf), 'o', "oooo")) 
{ 
    fprintf(stderr, "Not enough space\n"); 
} 
else 
{ 
    puts(buf); 
} 
+0

uhm .... pourquoi int remplacer, et non remplacer char? – Cmag

+0

erreur: types conflictuels pour 'remplacer' – Cmag

+0

@Clustermagnet - 1. Il renvoie 'int' qui est' 0' en cas de succès, non nul en cas d'erreur. Au fur et à mesure que vous en apprendrez plus, vous verrez que c'est un modèle commun. 2. Je vais deviner que vous avez collé ceci dans un endroit où 'replace' était déjà défini. – asveikau

1

fix comme ce

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

char *replace_char (char *str, char find, char *replace) { 
    char *ret=str; 
    char *wk, *s; 

    wk = s = strdup(str); 

    while (*s != 0) { 
     if (*s == find){ 
      while(*replace) 
       *str++ = *replace++; 
      ++s; 
     } else 
      *str++ = *s++; 
    } 
    *str = '\0'; 
    free(wk); 
    return ret; 
} 

int main(void){ 
    char base64output[4096] = "FtCPpza+Z0FASDFvfgtoCZg5zRI="; 
    char *signature = replace_char(base64output, '+', "%2B"); 
    signature = replace_char(signature, '/', "%2F"); 
    signature = replace_char(signature, '=', "%3B"); 
    printf("%s\n", base64output); 

    return 0; 
} 
+1

Cette solution suppose que la source dispose de suffisamment d'espace. – asveikau

+1

@asveikau C'est correct. Il a été supposé dans le code original. – BLUEPIXY

+0

génial! Merci! Maintenant, question, et si j'avais besoin d'augmenter la variable base64output, puisque je remplace les caractères simples avec des caractères triples – Cmag

0

ci-dessous est un code qui fonctionne réellement !!!!

Ammar Hourani

char * replace_char(char * input, char find, char replace) 
{ 

char * output = (char*)malloc(strlen(input)); 

for (int i = 0; i < strlen(input); i++) 
{ 
    if (input[i] == find) output[i] = replace; 
    else output[i] = input[i]; 
} 

output[strlen(input)] = '\0'; 

return output; 
}