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 |