修改自己编写的concat函数,使其能够接受两个以上的参数。

3

我编写了一个自己制作的连接函数:

char * concat (char * str1, char * str2) {
    for (int i=0; i<BUFSIZ; i++) {
        if (str1[i]=='\0') {
            for (int j=i; j<BUFSIZ; j++) {
                if (str2[j-i]=='\0') return str1;
                else str1[j]=str2[j-i];
            }
        }
    }
}

现在如果我想连接超过2个字符串,比如buf temp1 temp2,我必须使用类似以下的方法:

strcpy(buf, concat(concat(buf,temp1),temp2));

请告诉我,是否有一种简单的方法可以修改我的函数,使其能够接受多个参数?


8
C还是C++?这非常重要。 - Konrad Rudolph
2
不简单,但你可以使用var_args类型的输入。Shutter。 - Michael Dorgan
如果你知道一种适用于C++但不适用于C的方法,那仍然很有趣... - Jake Badlands
@JakeBadlands:在真正的C++程序中使用的绝大多数技术在C中都无法使用。这两种语言是_不同_的,请说明您正在使用哪一种。 - Lightness Races in Orbit
哈哈 - 这里还是上午,我还没有喝咖啡 :) - Michael Dorgan
3个回答

4

在C++中使用字符串(string)代替 char*及函数:std::string result = std::string(buf) + temp1 + temp2;

这样做有利于代码的可读性和可维护性。


3

您要寻找的功能是varargs。这使您可以编写一个接受可变数量参数的C函数。这就是像printf这样的函数实现方式。

char* concat(size_t argCount, ...) {
  va_list ap;

  char* pFinal = ... // Allocate the buffer
  while (argCount) {
    char* pValue = va_arg(ap, char*);
    argCount--;

    // Concat pValue to pFinal

  }
  va_end(ap);

  return pFinal;
}

现在您可以使用可变数量的参数调用concat。
concat(2, "hello", " world");
concat(4, "hel", "lo", " wo", "rld");

1
不幸的是,那样做行不通。当我尝试像这样做时:char buf[BUFSIZ]; strcpy(buf, concat(2, "hello", " world")); 我在运行时得到了一个 EXC_BAD_ACCESS 错误。错误行是 char* pValue = va_arg(ap, char*); - Jake Badlands
2
@JakeBadlands,你只能修改可写内存,而字符串字面量不是可写的。你需要这样做:char h[6] = "hel"; concat(2, h, "lo"); - Dave
我已经将“分配缓冲区”的那一行更改为char* pFinal = (char *) malloc (BUFSIZ);。现在,当我尝试使用char h[BUFSIZ]="hel"; concat(2, h, "lo");时,h应该包含“hello”,但实际上它包含的是“hel”。 - Jake Badlands

2
非常简单:
#include <string>
#include <iostream> // for the demo only

std::string concat(std::string const& a) {
  return a;
}

template <typename... Items>
std::string concat(std::string const& a, std::string const& b, Items&&... args) {
  return concat(a + b, args...);
}

int main() {
  std::cout << concat("0", "1", "2", "3") << "\n";
}

ideone中看到它的实际应用:
0123

当然,你可以添加一些重载以提高效率。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接