본문 바로가기

[C++] std::string::data()

반응형

data()는 std::string 멤버함수로, c_str()과 유사하게(?) 동작한다. (const char* 반환)

 

  • C++ 표준

대략 C++표준에 대한 내용은 다음과 같다. 

 

C++11, data() 반환 타입에 대해 명시되어 있지 않음.

컴파일러에 따라, char*를 반환할수도 있고, const char*를 반환할수도 있음.

많은 구현체에서 const char*를 반환하도록 구현했음.

 

C++14, data() 반환 타입이 const char*로 명시

 

C++17, std::string::data() 와 std::string::c_str()이 동일한 반환 타입(const char*)을 가지며, null-종결을 보장.

 

그런데, C++17, C++20에서 컴파일하면 위 내용과 조금 다르게 동작한다.

테스트는 g++ (Debian 13.2.0-25) 13.2.0 // Visual Studio 2022 에서 했다.

#include <string>

int main()
{
    std::string str = {};
    
    //C++11, 14, 에러 발생
    //C++17, 20, 컴파일 성공
    char* ptr = str.data(); 

    return 0;
}

 

 

  • 사용자 입력

재밌는건, C++11, 14, 17, 20 상관없이, scanf 함수로 std::string 변수에 데이터를 입력받을 수 있다.

(에러가 발생하지 않는 이유는 잘 모르겠다. const char* → char* 묵시적인 변환이 안되는걸로 알고 있는데...)

//C++11, 14, 17, 20, 모두 컴파일 성공
scanf("%s", str.data());

 

이렇게 입력 받은걸 출력하려면 printf()를 사용해야 한다.

printf("%s\n", str.data()); //사용자 입력 출력
std::cout << str << std::endl; // 출력 안됨

 

cout으로 출력되지 않는 이유는, cout은 std::string length 값을 이용해서 출력하기 때문이다. (null이 중요하지 않다.)

scanf()로 std::string 변수에 데이터를 입력 하더라도, std::string length 값이 변경되지 않아서, 최초 값(0, 빈문자열)을 유지하고 있어서 아무것도 출력되지 않는다.

std::string::size() 혹은 std::string::length() 함수를 호출해보면 값이 0임을 확인할 수 있다.

 

 

  • 결론(?)

C++은 C++ 사용자 입력 함수를 사용하자.

C언어 사용자 입력 함수를 사용하려면, 배열을 쓰자.

반응형

'C&C++' 카테고리의 다른 글

[C++11] cstdint  (0) 2024.07.29
[C++] 소수점 출력  (0) 2024.07.28
[C++] std::string  (0) 2024.07.07
[C++11] thread  (0) 2024.06.29
[C++17] filesystem  (0) 2024.06.29