3/16 TIL

7663 단어 TILTIL

문자열 예제

  1. 문장을 입력받아서(최대 n자) 글자 수를 세는 예제 프로그램 만들기, n자를 넘어서면 n자를 출력하고 뒤에는 무시.
    1. scanf(”%s”) : scanf는 단어 단위로 입력을 받기 때문에 띄어쓰기가 포함된 문장은 원하는 답을 출력하지 못함

    2. gets : 우리가 원하는대로 답을 얻을 수 있지만 gets는 안전하지 않기 때문에 사용을 지양 (버퍼사이즈를 작게 할당해도 지가 마음대로 할당해서 씀)

    3. fgets : 버퍼사이즈를 함수안에 직접 설정하기때문에 gets에 비해 안전함. fgets(buffer, BUFFER_SIZE, stdin) 처럼 버퍼사이즈를 직접 설정해놓기 때문에 버퍼의 크기를 초과하는 일이 없음.

      하지만 줄바꿈 문자(\n)까지 같이 저장해버리기 때문에 줄바꿈이 같이 출력되고 문자열 크기+1 되는 문제가 발생함. 해결방법으로는 마지막 문자를 NULL값으로 바꿔주면 됨. 근데 이러면 우리가 설정해놓은 버퍼사이즈를 초과하게 되면 여러 줄이 출력되서 원하는 답이 아님.

    4. 직접 함수 만들어서 쓰기 : 그냥 직접 만들어서 쓰면 됨..ㅋ

      int read_line(char str[], int buffer){
          int ch, i = 0;
      
          while((ch = getchar()) != '\n') {
              if (i<buffer)
                  str[i++] = ch;
                  str[i] = '\0';
          }
          printf("%s", str);
          return i;
      }
  1. getchar()란 입력받은 버퍼의 첫 문자를 반환하는 함수이다. 버퍼는 문자를 저장하는 스택이다.

    int i;
    char ch;
    scanf("정수 : %d", &i);
    printf("정수 : %d", i);
    
    getchar();
    
    ch = getchar();
    printf("문자 : %c", ch);

    3번째 줄에서 6을 입력했다고 치자. 그러면 6을 치고 엔터를 눌렀기 때문에 현재 버퍼에는 [6, \n]이 있다. 그리고 4번째 줄에서 6을 써버렸기 때문에 버퍼에는 [\n]이 남아있다. 만약 이 상태에서 다섯번째 줄에 있는 getchar()를 하지않고, 즉 버퍼에 남아있는 개행문자를 반환시키지 않고 바로 여섯번째 줄로 넘어갈 경우 ch에는 개행문자가 들어가게 되어 바로 프로그램이 끝나게 된다.

  1. 문자열을 입력받아 의미없는 공백을 삭제하여 출력하는 프로그램 만들기. 즉 맨 앞의 공백과 맨 뒤의 공백은 아예 없애버리고 문자 중간에 있는 2개 이상의 공백은 하나의 공백으로 줄이면 됨.

    while((ch = getchar()) != '\n'){
    	if((i==0 && ch == ' ') || (ch == ' ' && str[i-1] == ' '))
    		continue;
    	str[i++] = ch;
    }
    
    if(i>0 && str[i-1] == ' ')
    	i--;
      str[i] = '\0';
    
    printf("%s\n", str);

하루를 마치며

진짜 요새 일하느라 너무 힘들다.. 5월에 유럽여행 가려고 비행기표, 숙박을 예약해놨다. 이제는 빼도박도 못하니 남은 경비를 모으려고 죽도록 일하는 중이다..ㅠㅠ 이 속도로 공부하다가는 플러터는 커녕 자료구조도 다 못끝내고 복학하게 생겼다. 제발..열심히 하자..제발!!!!

좋은 웹페이지 즐겨찾기