qhrrkfl2   6달 전

일단 문자열은 char형 포인터로 받을수 있다고 압니다.


char * str;

str= "문자열을 이케 받으면 되용~";

그런데 입력을 통한 문자열을 받으려면 저런 방식으로는 안되지 않습니까?

제 질문은

1. 입력으로 문자열을 받고싶습니다. (string class를 사용 안하고)

2.입력받은 문자열을 문자 로 쪼갤수 있는 방식으로 입력받고싶습니다.

(입력받은것이 배열이니까 배열이름으로 주소값의 가감산을 하고싶어요)

3.입력받은 문자열의 길이 만큼 메모리를 할당하고 싶습니다.(char[128]이런식으로 댐 넣기 싫어욤!)

appa   6달 전

#include <iostream>

#include <string>

#include <fstream>

using namespace std;

int main() {

       ios_base::sync_with_stdio(false);
       string s;
      ifstream inf(stdin);
      getline(inf, s);
      cout << s << "\n";
      for (int i = 0; i < s.size(); i++) cout << s[i];
}

plzrun   6달 전

((아빠님이 스승님이신건가요?! ㅎㅎ))

아무튼..... string class를 사용하지 않는다고 하셨는데, 왜 안하시는건지..? (시비 아니에요;;ㅋ)

일단 cin으로 입력받아야 하기 때문에 느리다고 생각하시면 scanf()로 char배열에 받은 다음, 이를 string 변수에 대입하는 방법이 있습니다.

이러면 cin으로 받을 때보다 훨씬 빠르죠. 아니면 getchar()로 하나씩 받아서 string 변수에 하나씩 붙여나가는 것도 좋습니다. 

(문자를 하나씩만 받을때는 scanf()를 쓰는것 보다 getchar()가 확실히 빠릅니다.)



그리고 또 원하시는 내용 자체가 매우 이기적인 발상인데, 원래 등가교환의 법칙이라고 ㅋㅋㅋㅋㅋ 하나가 이득이면 하나를 버려야 해요. 그쳐? ㅋ

마치 나는 링크드리스트를 쓰고싶은데 배열처럼 인덱스도 쓰고 그러면서 양쪽 자료구조의 효율을 다 갖고 싶어! 하는 느낌이에요...

메모리 낭비하기 싫은데 string 타입은 가져다 쓰기 싫으면, 직접구현하는 방법밖엔 없습니다. 좋은건 가져다 씁시당~ ㅎ



#include <cstdio>
#include <iostream>
#include <string>
#include <vector>
using namespace std;
vector<string> v;
int main() {
    char c;
    while(true) {
        string s;
        while((c=getchar())!=' ' && c!='\n' && c!='\r' && c!=EOF) {
            s+=c;
        }
        if(c==EOF) break;
        else v.push_back(s);
    }

    for(int i=0; i<v.size(); i++) {
        cout << v[i] << '\n';
    }
}


저라면 이 정도가 한계인거 같습니다.

string s;를 while반복문 안에서 빼고, 반복문 돌때마다 초기화 시켜주는 것도 괜찮겠네요...


사실 PS에선 이 방법 보다 그냥 char s[1000000]; scanf("%s", s);를 추천합니다. ㅋㅋ

qhrrkfl2   6달 전

그렇군여 구현방법에 있어서 어느정도 손해는 봐야지 하는 부분이 있네요 감사합니다.

appa님 코딩이 너무 어려워요 ㅠㅠ

스트링클래스를 사용안하려고 하는이유는 그냥 char 포인터를 이용해서 주소의 가감산이 저에겐 좀더 직관적이고 이해가 편하기 때문에 그래요.

스트링 클래스에 char 형 변수를 집어넣으려고 하니 쓰래기값이 같이 들어가기도하고 구현이 잘 안되서요...

appa   6달 전

string 클래스에 char형 변수 넣고 싶으시면 한 문자씩 계속 더해주시면됩니당.

예를 들어서 

char *a = "hi appa";

string s = "";

for (int i = 0; i < strlen(a); i++) s += a[i];

이런식으로 하면 s에 a의 내용이 모두 담겨요.

그리고 s는 기존 배열처럼 s[1], s[2] 이런식으로 참조되구요.

s.size()하면 strlen(s)와 같은 결과를 얻을 수 있구요. 

cout말고 printf로 출력하고 싶으면 printf("%s", s.c_str()); 해주시면되어요.

plzrun   6달 전

우왕 c_str()은 모르는거였는데.. ㅋㅋㅋㅋ 감사합니다 ㅋ

댓글을 작성하려면 로그인해야 합니다.