2017-01-16 7 views
1

필자는 입력하는 동안 입력 문자열을 동적으로 할당하기 위해 길이가 긴 문자를 사용자에게 묻지 않고 다음 함수를 작성했습니다.입력 문자열의 동적 할당

#include<stdio.h> 
#include<stdlib.h> 

char* dyninp (char str[], int *n) { 
    char ch; 
    int i = 0; 
    do { 
    ch = getchar(); 
    str = (char *) realloc(str, (i+1)*sizeof(char)); 
    str[i] = ch; 
    i++; 
    } while (ch != '\n'); 

    /*substitute '\n' with '\0'*/ 
    str[i-1] = '\0'; 

    if (n != NULL) { 
    /*i contains the total lenght, including '\0'*/ 
    *n = i-1; 
    } 

    /*because realloc changes array's address*/ 
    return str; 
} 

/*it is called in this way: 
char *a; 
int n; 
a = dyninp (a, &n); 
*/ 

이 코드는 작동하지만, 나는 그것에 대해 몇 가지 질문이 있습니다

이 이
  1. 가 왜 작동 하는가를?
    이유를 모르겠지만 실행하면 Enter 키를 누르기 전에 문자를 삭제할 수 있습니다. getchar() 함수는 각 반복마다 하나의 문자 만 읽습니다.이 문자는 배열에 쓰여지므로 어떻게 문자를 삭제할 수 있습니까?
    '\ 127'을 받았을 때 getchar()이 이전 문자를 삭제하면 루프는 다른 문자와 마찬가지로 계속 실행되어야합니다. 그러나 이것은 루프가 끝날 때 "i"에 항상 정확한 수의 요소가 포함되어 있기 때문에 발생하지 않습니다.

  2. 내 코드가 효율적입니까? 그렇지 않은 경우 어떻게 내장 함수를 사용하여 더 잘 만들 수 있습니까? 첫 번째 질문에 대한

답변

1
  1. "원시"모드로 설정하지 않으면 운영 체제는 사용자가 return 키를 누를 때까지 응용 프로그램에서 입력을 사용 가능하게하지 않습니다. 입력 편집은 운영 체제에서 처리합니다. getchar()에 전화하면 터미널에서 직접 가져온 것이 아니라이 입력 버퍼에서 문자를 읽습니다.

  2. 같은 일을하는 POSIX 함수 getline()이 있습니다.

1

답변 :

그 이유는 아마도 터미널 드라이버에 버퍼링된다. 메모 섹션의 간단한 설명은 here입니다. getchar() 함수는 터미널에서 사용자가 전체 문자열을 받고 문자를 반환 할 때 줄이 커밋 될 때까지 입력을받지 않습니다. 따라서 삭제는 프로그램이 아니라 터미널의 기능입니다.