C替换char数组中的char

时间:2013-05-15 19:14:22

标签: c

人们需要搜索一个字符数组,并分别用“%2B”,“%2F”和“%2F”替换任何出现的'+','/'或'='

base64output变量看起来像

FtCPpza+Z0FASDFvfgtoCZg5zRI=

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;
}

(错误)

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

我做错了什么?谢谢!

6 个答案:

答案 0 :(得分:5)

如果问题是您的签名变量中有垃圾:

void replace_char(...)signature = replace_char(...)

不兼容

编辑:

哦,我没有看到......这是行不通的,因为你试图用一系列字符替换一个字符而没有任何内存分配。

你需要分配一个足够大的新内存块(malloc)来保存新字符串,然后将源代码复制到目的地,在需要时将'c'替换为'replace'。

原型应该是: char *replace_char(char *s, char c, char *replace);

答案 1 :(得分:2)

你可以花一些时间讨论各种方法来做到这一点。

替换单个字符很简单 - 循环,如果匹配,则将old替换为new,等等。

这里的问题是“新”部分的长度比旧部分的长度长。

一种方法是确定新字符串的长度(通过计算字符),并且(1)尝试在适当的位置进行,或者(2)分配新的字符串。

这是#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;
}

然后你可以这样使用它(这是我做的快速测试):

char buf[4096] = "hello world";

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

答案 2 :(得分:1)

您的replace_char签名会返回void

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

但是,当链接器尝试解析以下

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

它找不到任何名为replace_char的函数并返回int(如果没有原型,则int是默认值)。

更改replace_char函数原型以匹配语句。

修改 警告声明您的函数返回char,但您将其用作char * 此外,你的功能不返回任何东西,你需要返回一些东西吗? 看起来你并不真正理解你正在使用的代码。 修复错误和警告而不完全理解你需要做什么是没有价值的..

答案 3 :(得分:1)

<强> 1

  • char使用''单引号

  • char*使用""双引号

<强> 2

  • 该函数包含return关键字,因此它不会返回您期望的

第3

答案 4 :(得分:1)

像这样修复

#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;
}

答案 5 :(得分:0)

下面是一个实际工作的代码!!!!

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;
}