5

伙计们,需要搜索字符数组并将任何出现的“+”、“/”或“=”分别替换为“%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

我究竟做错了什么?谢谢!

4

6 回答 6

6

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

void replace_char(...)不兼容signature = replace_char(...)

编辑:

哦,我没看到...这行不通,因为您试图用一个字符数组替换一个字符,而没有任何内存分配。

您需要分配一个足够大的新内存块 (malloc) 以容纳新字符串,然后将源 's' 复制到目标,并在需要时将 'c' 替换为 'replace'。

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

于 2013-05-15T19:17:36.030 回答
3

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

替换单个字符很简单 - 循环遍历,如果匹配,将旧字符替换为新字符等。

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

一种方法是确定新字符串的长度(通过计算字符),或者(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);
}
于 2013-05-15T20:13:20.310 回答
3

1.

  • 使用char''引号

  • 使用char*""引号

2.

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

3.

于 2013-05-15T20:20:40.717 回答
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 * ,您的函数不返回任何东西,您需要返回一些东西吗?看起来您并不真正了解您正在使用的代码。在不确切了解您需要做什么的情况下修复错误和警告是毫无价值的。

于 2013-05-15T19:22:17.907 回答
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;
}
于 2013-05-15T22:40:25.317 回答
0

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

阿马尔·霍拉尼

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;
}
于 2016-09-26T02:58:13.887 回答