Измените самодельную функцию concat, чтобы она принимала более двух аргументов. - PullRequest
3 голосов
/ 09 февраля 2012

Я запрограммировал самоконкурентную функцию concat:

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

Скажите, пожалуйста, есть ли простой способ изменить мою функцию, чтобы она принимала много аргументов?

Ответы [ 3 ]

4 голосов
/ 09 февраля 2012

В C ++ используйте строку вместо char* и функции: std::string result = std::string(buf) + temp1 + temp2;

3 голосов
/ 09 февраля 2012

Функция, которую вы ищете - 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");
2 голосов
/ 09 февраля 2012

Очень просто:

#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

Конечно, вы можете добавить некоторые перегрузки для эффективности.

...