人们需要搜索一个字符数组,并分别用“%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
我做错了什么?谢谢!
答案 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;
}