안녕하세요 교수님
이름과 나이를 입력받는 구간에서
#include <iostream>
#include <string>
using namespace std;
int main()
{
string name;
char age;
cin >> name;
cin >> age;
cout << "이름은 " << name << endl;
cout << "나이는" << age << endl;
return 0;
}
라는 코드 즉, 나이를 char로 받을 경우 문자열 하나만 인식해서 28을 넣어도 2로 인식이 되더라구요. char이 이전 까지는 -128 ~ 127의 범위를 가지는 것인줄 알았는데
제가 cin에서 입력하는것이 문자열로 인식이 되어서 그렇다고 하기엔
int age 로 정의하면 아무 문제가 없어서 문의드립니다.
어떤 이유로 char age 에서 한자리 밖에 출력이 안되는지 질문 드립니다.
항상 감사드립니다.
전선생
2
1
안녕하세요!
안녕하세요. 16분 50초에서요.std::cin.ignore(std::numberic.......::max(), 'n');std::cin.ignore(32767, 'n');std::getline(std::cin, age);세개 다 메모리나 속도 측면에서 크게 관계가 없나요?좋은강의 잘 보고 있습니다. 고맙습니다. :)
Yellow C.a.r.d
1
2
std::cin.ignore(32767, '\n')과 numeric_limits 에서 이런 방법은 어떤가요?
<첫번째 질문>
(1) std::cin.ignore(32767, '\n');
(2) std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
1번은 매직넘버를 쓰기 때문에 좋지 못한 코드이고,
2번은 <limits> 를 #include 해야 하고, 길어서 타이핑이 불편합니다.
\n을 만날때까지 최대 32767 개 의 글자를 무시해라 라는 의미라면
ignore의 첫번째 매개변수에는 어떤 자료형의 signed 최대값이 인자로 들어가는구나 생각할 수 있습니다.
그 첫번째 인자로 INT_MAX 나 CHAR_MAX 같은 것을 사용하는건 어떻게 생각하시나요?
<두번째 질문>
INT_MAX 에는 2147483647 / CHAR_MAX에는 127 값이 들어있습니다.
제 생각엔 INT는 너~~무 많고(낭비), CHAR은 좀... 적은것 같습니다. 좀 더 넓었으면 좋겠습니다.
그렇다면 매직넘버를 사용하는 대신,
Short 자료형의 최대값인 32767을 short 변수를 만들어 저장한 뒤,
ignore함수의 첫번째 인자로 넣어주는 것 입니다.
위의 두 가지 방법에 대해서는 어떻게 생각하시나요?
DoJin
0
1
[10:30]
#include<iostream>
#include<string>
int main() {
using namespace std;
cout << "Your name? : ";
string name;
cin >> name;
cout << "Your age? : ";
string age;
cin >> age;
cout << name << " " << age << endl;
return 0;
}
1)
jack jack을 입력받았을 때 왜 마지막줄의
cout<<name<<" "<< age<<endl;
부분은 실행(출력)이 되지 않나요??
2)
입력으로 j1 j2 j3를 입력했을 때 한줄씩 디버깅하면 변수값이
age= j1, name=j2가 나옵니다.
실행파일에서는 age가 j1, j2로 나오는 이유를 모르겠습니다.
ififi ifif
0
1
13:00 숫자입력받고 문자열 입력받기
안녕하세요
1.
13:00경에 숫자입력받고 문자열은입력받을때
아래코드로 실행을하면
cout<<Your age?<<endl;
int age;
cin>>age;
cout<<Your name?<<endl;
string name;
std::getline(std::cin ,name);
cout<<name<<" " << age << endl;
Your age? 에 1 엔터
를 하면
Your name? 1이 출력되고 끝납니다.
왜이러는건가요?
1엔터를 치는순간 1과 엔터가 콘솔입력버퍼로 들어가고 1은 cin>>age 에따라 age에 들어가서 버퍼는 엔터말고는 비어버리니까std::getline(std::cin ,name); 에 의해 추가로버퍼로의 문자열 입력이 필요하므로 콘솔창 추가입력이 있어야 콘솔->버퍼-> name 으로의 입력이 최종적으로 끝나고 출력단계로 넘어가야 하는것 아닌가요?
2.위의 오류는 정수입력을 종료하고나서(cin>>age 아랫줄에)
std::cin.ignore(32767,'₩n') 을 입력하면 해결되는데 std::cin.ignore(32767,'₩n') 은 구체적으로 무슨역할을 하는건가요?
TaeChoon Pakr
0
2
교수님 질문있습니다!
[13.14] 이부분에서 왜 cin >> age; 로 받은 값이 왜 바로 Your name ? : 으로 출력이 되는지 궁금합니다.
YH Lee
0
1
std string 사용시에
강의에서 string 사용하려면 string 헤더를 include 하고 있는데 c++로 알고리즘 코딩하다 우연히 string 헤더를 include 하지 않았음에도 string 자료형이 잘 사용된다는 것을 알았습니다. 왜 그런것인가요?
이윤석
0
4
[10:30]<자답> cin에 빈칸이 있는 문자열 넣을 때 문제
질문을 작성하면서 정리가 된다는 걸 경험했습니다.
<code>
#include <iostream>
#include <string>
using namespace std;
int main()
{
cout << "Your name : " << endl;
string name;
cin >> name;
cout << endl;
// cin.ignore();
cout << "Your age : " << endl;
string age;
cin >> age;
cout << endl;
cout << "address : " << endl;
string addr;
cin >> addr;
cout << endl;
cout << name << "##" << age << "##" << addr << endl;
return 0;
}
<output>
PS C:\coding\tbc_review\TBCPP\Chapter4> .\a.exe
Your name :
hong gil dong
Your age :
address :
hong##gil##dong
요렇게 빈칸을 기준으로 문자열을 받는거네요.감사합니다.
호두
0
1
[10:30] 문자열 중간에 빈칸이 있을 때 age로 넘어가는 문제
이해가 안돼서줄바꿈을 해줘봤어요
<code>
#include <iostream>
#include <string>
using namespace std;
int main()
{
cout << "Your name : " << endl;
string name;
cin >> name;
cout << endl;
// cin.ignore();
cout << "Your age : " << endl;
string age;
cin >> age;
cout << endl;
cout << name << "##" << age << endl;
return 0;
}
<output>
PS C:\coding\tbc_review\TBCPP\Chapter4> g++ *string.cpp*
PS C:\coding\tbc_review\TBCPP\Chapter4> .\a.exe
Your name :
Jack Jack
Your age :
Jack##Jack
==========================
첫 번째 cin에서 빈칸 앞의 Jack을 입력받아서 name에 저장하고
두 번째 cin에서 빈칸 뒤의 Jack을 입력받아서 age에 저장하고 줄바꿈을 만나서
입력을 끝낸다는 건가요?
감사합니다.
호두
0
1