0

我在使用以下代码时遇到了一些问题:

/* replace c1 with c2 in s, returning s */
char *substitute(char *s, char c1, char c2)
{
    char *r = s;
    if (s == 0) return 0;
    for (; *s; ++s)
        if (*s == c1) *s = c2;
    return r;
}

void substitute(char c1, char c2);

int main()
{
    string s = "apples";
    char a;
    char b;

    cout << "Before swap of Char : " << s << endl;

    *substitute(&a, &b);

    cout << "After swap of Char : " << s << endl;

    system("pause");
}

上面的代码应将char1字符串中出现的任何 . 替换为char2. 我认为我的功能正确,但调用它有点问题,因为Substitutemain 中的部分显示错误。

我的问题是如何从这里继续并在 main 中调用该函数?

编辑:我已经阅读了已经给出的答案,但我仍然对初学者感到困惑..

再次编辑:我已经解决了!:)

4

5 回答 5

1

如果您使用的是 c++(11),您可能想要使用标准库和语言工具:

 std::string input = "apples";
 const char from='a';
 const char to='b';
 std::for_each(input.begin(),input.end(),
  [&](char& current) {
   if(current==from)
    current=to;
 });

甚至更简洁

for (char& current : input) {
   if(current==from)
     current=to;
}
于 2013-08-08T12:25:10.647 回答
0

当你的函数需要 3 个参数时,你传递了两个参数,而且函数本身不会按预期工作。

另外,附带说明一下,使用 cin.get() 而不是 system("pause");

只需使用字符串类的方法replace。

于 2013-08-08T11:59:50.573 回答
0

以下是我在代码中看到的问题:

  1. substitute()应该得到 3 个参数char*,char,char或者如果你以后有一个函数substitute(char,char)。但是,您正在发送char*,char*给它,因此编译器不知道要调用哪个函数(除非您有另一个带有此签名的函数,此处未显示)。这是编译时错误的原因

  2. 您正在尝试修改字符串文字,如果您要修复编译时错误,它可能会创建运行时错误。请注意,不应修改字符串“apples”,因为它是字符串文字。您将需要复制它然后更改它。修改它的确切行为是未定义的,正如@6502 所指出的(参考评论)

  3. 您的代码识别不佳(尽管编辑修复了此问题)。

  4. a,b未初始化并包含“垃圾”值。

于 2013-08-08T12:00:05.603 回答
0

初始化ab然后调用替代方法substitute(s,&a, &b);

删除void substitute(char c1, char c2);不需要的方法原型。

于 2013-08-08T12:00:29.300 回答
0

照原样,您可以像这样调用该函数:

char a = 's', b='t';
char s[] = "some string";
s = substitute(s, a, b);

第二个和第三个参数不是指针,所以你可以只传递aand b,你不必传递&aor &b

请注意,由于您只是修改第一个参数中的字符串,因此实际上没有理由将其分配给任何东西。substitute(a, b);将与s = substitute(s, a, b);.

如果你不必使用你的返回值,那么一开始就没有理由返回它。您可以将您的功能更改为:

/* replace c1 with c2 in s, returning s */
void substitute(char *s, char c1, char c2)
{
    if (s == 0) return;
    for (; *s; ++s)
        if (*s == c1) *s = c2;
}
于 2013-08-08T12:00:32.110 回答