std :: string에 문자를 추가하는 방법은 무엇입니까?


175

다음은 오류와 함께 실패합니다 prog.cpp:5:13: error: invalid conversion from ‘char’ to ‘const char*’

int main()
{
  char d = 'd';
  std::string y("Hello worl");
  y.append(d); // Line 5 - this fails
  std::cout << y;
  return 0;
}

또한 컴파일했지만 런타임에 임의로 동작하는 다음을 시도했습니다.

int main()
{
  char d[1] = { 'd' };
  std::string y("Hello worl");
  y.append(d);
  std::cout << y;
  return 0;
}

이 바보 같은 질문에 대해 죄송하지만 Google에서 검색 한 결과 "char array to char ptr", "char ptr to char array"등이 있습니다.


컴파일러 오류 예. 오류가 무엇인지 잊었지만 합리적입니다.
익사

3
아래에 더 나은 답변이 있지만 다음과 같이 작동하는 두 번째 예제를 만들 수 있습니다. d [2] = { 'd', 0}; 또는 단지 char d [2] = "d"; 기본적으로 추가 할 c 스타일 문자열을 종료하려면 0이 필요합니다
sbk

여기에 좋은 문서가 있습니다 : sgi.com/tech/stl/basic_string.html
Martin York

답변:


225
y += d;

+=명명 된 함수 대신 연산자를 사용 합니다.


2
push_back보다 + =가 더 좋은 이유는 무엇입니까? 타이핑이 적습니까 아니면 다른 이유가 있습니까?
Glen

4
타이핑이 적습니다. 에서는 gcc, basic_string::operator+=단지 전화입니다 push_back.
eduffy

2
문자열에 더 자연스러운 IMO입니다. push_back은 컨테이너 함수이고 문자열은 STL에 특화된 문자열입니다.)
AraK

6
이 질문을 바꿔 보자. 왜 push_back을 + =보다 낫게 생각합니까? 제 생각에 + =는 명확하고 간결합니다.
Jesper

34
당신은 당신이하는 습관을 얻는 경우에 경우에,이 잘 컴파일하기 때문에이 조심해야 할 yA는 char*대신 std::string. d포인터 y 에 문자를 추가 합니다.
Zan Lynx


19

append 메소드를 사용하여 std :: string var에 char를 추가하려면이 오버로드를 사용해야합니다.

std::string::append(size_type _Count, char _Ch)

편집 : 맞습니다. 컨텍스트 도움말에 표시된 size_type 매개 변수를 잘못 이해했습니다. 추가 할 문자 수입니다. 올바른 전화는

s.append(1, d);

아니

s.append(sizeof(char), d);

또는 가장 간단한 방법 :

s += d;

sizeof를 사용하는 것이 의미 적으로 정확하지 않다고 생각합니다 (sizeof (char)가 항상 하나이므로 작동하더라도). 동일한 문자의 사본을 더 추가하려는 경우 append 메소드가 자연스럽게 더 유용합니다 !!!!!!!!!!
UncleBens

1
sizeof(char)대신에 사용 하고 1있습니까? 의 반복을 정확히 한 번 추가하고 싶습니다 d. 사용 sizeof이 하나의 이야기한다는 것을 알 수 있기 때문에 오해의 소지가 여기에 append(경우에하지 않은) 사용되는 데이터 형식의 바이트 크기.
Ferdinand Beyer

Unclebens가 말했듯이 append 메소드는 동일한 문자를 여러 번 추가 할 때 실제로 더 유용합니다.
파트리스

10

언급 된 다른 것 외에도 문자열 생성자 중 하나는 char과 해당 char에 대한 반복 횟수를 취합니다. 이를 사용하여 단일 문자를 추가 할 수 있습니다.

std::string s = "hell";
s += std::string(1, 'o');

7

여러 제안을 큰 고리로 실행하여 테스트합니다. Microsoft Visual Studio 2015를 컴파일러로 사용했으며 프로세서는 i7, 8Hz, 2GHz입니다.

    long start = clock();
    int a = 0;
    //100000000
    std::string ret;
    for (int i = 0; i < 60000000; i++)
    {
        ret.append(1, ' ');
        //ret += ' ';
        //ret.push_back(' ');
        //ret.insert(ret.end(), 1, ' ');
        //ret.resize(ret.size() + 1, ' ');
    }
    long stop = clock();
    long test = stop - start;
    return 0;

이 테스트에 따르면 결과는 다음과 같습니다.

     operation             time(ms)            note
------------------------------------------------------------------------
append                     66015
+=                         67328      1.02 time slower than 'append'
resize                     83867      1.27 time slower than 'append'
push_back & insert         90000      more than 1.36 time slower than 'append'

결론

+= 더 이해하기 쉬운 것처럼 보이지만 속도에 관심이 있다면 추가를 사용하십시오.


이러한 대답이 의미가 있으려면 사용중인 컴파일러에 대해 최소한의 정보를 제공해야합니다. 그 이유는 LOT에 따라 달라질 수 있기 때문입니다. 실제 영향에 대한 대략적인 추정치를 얻으려면 프로세서에 대해 알려주는 것도 좋습니다.
akaltar

저는 Visual Studio 2015를 사용했습니다. 다른 테스트를 수행하기 위해 gcc를 찾을 것입니다. 프로세서는 i7, 8 hearts, 2.20 Ghz입니다 ...하지만 프로세서가 무엇이든 std :: string 구현에 영향을 미치지 않습니다 ... 이러한 방법 중 일부가 멀티 스레드이고 다른 방법이 아닌 경우를 제외하고.
Hugo Zevetel

때로는 밀리 초 단위로 타이밍을 표시하는 경우 영향을 미칩니다. 대신 가장 빠른 방법에 비해 백분율로 표시 할 수 있습니다 (따라서 실제 프로세서 속도는 관련이 없습니다) 또한 주석에서 답변으로 해당 데이터를 이동하십시오. 이것은 일반적인 StackExchange 에티켓입니다. 그렇지 않으면 좋은 대답입니다.
akaltar


2

문제 :

std::string y("Hello worl");
y.push_back('d')
std::cout << y;

char d = 'd'와 같이 char 이름을 사용하는 것과는 반대로 'd'를 가져야한다는 것입니다. 아니면 내가 틀렸어?


방금 시도했지만 정상적으로 작동했습니다. 나는 char c = 'd'있고 y.push_back(c)문제없이 할 수 있습니다 . 따라서 문제가 없습니다 std::string::push_back()(이보다 길다는 것을 제외하고 +=).
Franklin Yu

1
int main()
{
  char d = 'd';
  std::string y("Hello worl");

  y += d;
  y.push_back(d);
  y.append(1, d); //appending the character 1 time
  y.insert(y.end(), 1, d); //appending the character 1 time
  y.resize(y.size()+1, d); //appending the character 1 time
  y += std::string(1, d); //appending the character 1 time
}

이 모든 예에서 문자 리터럴을 직접 사용할 수 있습니다 y += 'd';.

두 번째 예 는 관련이없는 이유로 거의 효과 가 있었을 것입니다. char d[1] = { 'd'};작동하지 않았지만 char d[2] = { 'd'};(배열의 크기가 2임을 유의하십시오)는 대략적으로 동일하게 작동했으며 const char* d = "d";문자열 리터럴 추가 할 수 있습니다 y.append(d);.


1

d를 포인터 y로 사용하십시오.


단일 char은 문자열이 아니며 null 종료자가 없으므로 위험 합니다. 이렇게하면 정의되지 않은 동작이 발생합니다.
Simon Kraemer

이것은 단지 잘못이다. *d포인터 가 아니기 d때문에 구문 오류 인 역 참조 포인터 를 의미 합니다 d.
Franklin Yu

0
str.append(10u,'d'); //appends character d 10 times

캐릭터를 추가하고 싶은 횟수만큼 10u 가 아니라 10u를 썼습니다 . 숫자를 10으로 바꾸십시오.


0

나는 간단한 방법을 찾았다. 나는 char즉시 만들어지고있는 끈에 붙일 필요 가 있었다. 나는 char list;사용자에게 선택권을 부여하고 그 선택을 switch()진술서 에 사용했기 때문에 필요했습니다 .

간단히 다른 std::string Slist;문자열을 추가하고 문자 "list"-a, b, c 또는 최종 사용자가 다음과 같이 선택한 것과 같은 새 문자열을 설정했습니다.

char list;
std::string cmd, state[], Slist;
Slist = list; //set this string to the chosen char;
cmd = Slist + state[x] + "whatever";
system(cmd.c_str());

복잡성은 시원 할 수 있지만 단순성은 더 시원합니다. 이모


0

아직 언급되지 않은 삽입 옵션 추가.

std::string str("Hello World");
char ch;

str.push_back(ch);  //ch is the character to be added
OR
str.append(sizeof(ch),ch);
OR
str.insert(str.length(),sizeof(ch),ch) //not mentioned above

-1

push_back을 사용하는 경우 문자열 생성자를 호출하지 않습니다. 그렇지 않으면 캐스팅을 통해 문자열 객체를 만든 다음이 문자열의 문자를 다른 문자열에 추가합니다. 작은 캐릭터에게는 너무 많은 문제가 있습니다.)


1
연산자 + = (char c); 문자열에 과부하가 걸렸습니다. 실제로, 문자열 생성자는 하나의 문자를 허용하지 않습니다. Brian answer;)를 참조하십시오.
AraK
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.