String [] decode (문자열 메시지)'문자열 배열'을 함수의 반환 유형으로 가져 오는 방법은 무엇입니까?
위의 예입니다. 디코딩 함수의 반환 값으로 2 개의 문자열 s1과 s2를 가져와야합니다. 어떻게해야합니까?
String [] decode (문자열 메시지)'문자열 배열'을 함수의 반환 유형으로 가져 오는 방법은 무엇입니까?
위의 예입니다. 디코딩 함수의 반환 값으로 2 개의 문자열 s1과 s2를 가져와야합니다. 어떻게해야합니까?
당신이 몇 가지 문자열을 반환 다음 중 하나를 사용해야하는 경우 :
- 표준 : : 쌍
- 부스트 :: 튜플
- 당신이 얼마나 많은 문자열을 모르는 경우 구조
함수 것 return - std :: vector와 같은 것을 사용하십시오.
곧 std :: tuple이 될 것이고 boost :: tuple이 아닙니다 :-) – Zifre
나는 그랬다면 vector
을 초로 반환 할 것입니다. 배열을 사용하면 메모리 관리에 대해 걱정할 필요가 있습니다. 또한 문자열을 수정하고 싶지 않으면 const 참조로 전달할 수 있습니다.
Top Coder 연습 세션에서 얻었습니다. 질문에서 일련의 문자열을 반환하라는 요청을 받았습니다. – abc
하드 코어와 도전 과제를 느낀다면 char **를 반환 할 수 있습니다.
그러나 이것은 매우 오류가 발생하기 쉽기 때문에 대신 표준 컨테이너 또는 문자열 클래스를 사용해야합니다.
읽기 http://www.lysator.liu.se/c/c-faq/c-2.html#2-10 – siddhant3s
@ siddhant3s : 그는 메인에있는 argv와 마찬가지로 char **를 의미합니다. NULL 종결자를 사용하십시오. 이것은 일을하는 구식 C 방식입니다. 이 접근법을 C++에서 비추천으로 취급해야하지만 * 잘 작동합니다. – dmckee
문자열을 포인터 또는 참조를 통해 "out"매개 변수로 함수에 전달하고 함수 내에서 수정합니다.
그들은 (Top Coder) C- 문자열 배열 또는 std :: 문자열 배열을 언급 했습니까? 당신은 여전히 표준 : : 문자열의 배열을 반환 할 경우 내용 는, 배열, 최근 (http://siddhant3s.googlepages.com/how_to_tell_rusted_cpp.html 및 http://www.parashift.com/c++-faq-lite/containers.html#faq-34.1) 악, 당신은 그러나 당신은 당신이 따라 [] 반환 된 포인터를 삭제 준다고 약속 할 수있는 경우에만 :
#include<iostream>
#include<string>
std::string* F1()
{
std::string* s=new std::string[2];
s[0]="Hello";
s[1]="World";
return s;
}
int main()
{
std::string* ss=F1();
std::cout<<ss[0]<<ss[1];
delete[] ss; //important step
}
예외가 없으면 가장 좋은 컴파일, 그렇지 않으면 아무것도 유출 메모리가 누출 ... –
나는 옵션은 말할 것 : 문자열의 고정 된 수의 경우
:
1) 한 쌍, 튜플, 또는 당신이 자신을 정의하는 구조체를 반환합니다. 뭔가 같은 : 다음
struct BrokenDownString {
std::string firstbit;
std::string middlebit;
std::string endbit;
};
중 하나
BrokenDownString decode(std::string message);
하거나 매개 변수로 메시지를 복용 생성자를 BrokenDownString 제공합니다.
void decode(const std::string &message, std::string &out_1, std::string &out_2) {
out_1 = /*whatever*/;
out_2 = /*whatever*/;
}
두 문자열 아무것도 (심지어 배열) 과잉이다 :
2) 밖으로 여러 포인터 또는 비 일정한 기준에 의해 PARAMS보십시오. 문자열의 변수 번호에 대한
은, 그러나, 당신이 중 하나를 수행 할 수 있습니다1) 돌려 std::vector<std::string>
(이 초과 복사 될 수 있습니다 점에 유의).
2) 매개 변수로 std::vector<std::string> &
을 가져 와서 결과를 추가합니다 (이 경우 문자열은 복사 할 수 있지만 컨테이너는 복사 할 수 없음).호출자가 벡터 결과 원한다면
template<typename OUT>
void decode(const std::string message, OUT out) {
// do parsing
*(out++) = firstbit;
*(out++) = nextbit;
// etc.
}
이어서 :
std::vector<std::string> v;
decode(message, std::back_inserter(v));
를 호출자에게 선호한다면
3) 파라미터로서 출력 반복자 복용 복호화 함수 서식 할 deque에서 :
std::deque<std::string> d;
decode(message, std::back_inserter(d));
호출자가 역순으로 목록에서 원하는 경우 :
std::list<std::string> l;
decode(message, std::front_inserter(l));
등등.
위 같은 것을 원하는 경우 4)하지만 어떤 이유로 당신은 템플릿 코드를 작성 디코드가 매개 변수로는 각 문자열의 통지 대상, 걸리고 싶지 않은 :
struct DecodeTarget {
virtual void append(const std::string &) = 0;
};
void decode(std::string message, DecodeTarget &out) {
// do parsing
out.append(firstbit);
out.append(nextbit);
// etc.
}
을
그런 다음 발신자는 벡터에 결과를 원하는 경우 : 당신이 절대적으로 배열을 반환해야하는 경우
class VectorTarget : public DecodeTarget {
private:
std::vector<std::string> &results;
public:
VectorTarget(std::vector<std::string> &v) : results(v) { }
void append(const std::string &bit) { v.push_back(bit); }
};
std::vector<std::string> v;
VectorTarget vt(v);
decode(message, vt);
, 당신은 사실을 사용할 수있는 포인터로 원시 배열 붕괴가. 이 방법은 다음을 추적 할 필요
#include <iostream>
#include <ostream>
#include <string>
std::string * decode()
{
std::string *ret = new std::string[2];
ret[0] = "foo";
ret[1] = "bar";
return ret;
}
int main()
{
std::string *baz = decode();
std::cout << baz[0] << baz[1] << std::endl;
delete [] baz;
return 0;
}
공지 것을 : 여기에 몇 가지 예제 코드는 내가 원하는 생각하지 그입니다 decode()
예, 고통 스럽습니다. 그래서 다른 모든 사람들이 std::pair
또는 std::vector
을 사용하여 작업을 처리 할 것을 제안했습니다.
나는 실제로이 특정 사건에 대한 이런 식으로 일을 권하고 싶지 않다,하지만 당신은 문자열의 배열에 참조를 반환 할 수 있습니다
std::string(& split_once(std::string arg))[]
static std::string result[2];
int i = arg.find_first_of('|');
result[0] = arg.substr(0,i);
result[1] = arg.substr(i + 1);
}
이이 특정에 적합하지 않습니다 응용 프로그램이지만 은이며 배열을 반환하는 유효한 방법이며 다른 상황에서 유용합니다. 나는 어딘가에서 사용했다고 생각하는데, 어디서 왜 그 이유를 기억하지 못한다.
할 수 있습니다 :
std::vector<std::string>
,하는 std::pair<std::string, std::string>
을 반환 문자열이나와 구조체를 반환, 반환에 대한 참조를 전달하고 그것을 설정하지 반환 :
void decode(std::string & s1, std::string & s2, const std::string & otherParam) {
// write the result to s1 and s2
}
을하면 방지 할 수 있습니다 참조 불필요한 사본.
std :: vector 디코드 (std :: string message); –