2017-05-01 5 views
0

scanf를 사용할 때/사용하기 전에 동적으로 메모리를 할당하는 방법이 있는지 알고 싶습니다. 이는 초기화 할 때 크기를 char *으로 줄 필요가 없음을 의미합니다. 이 대신에 필요한 메모리의 양은 입력 문자열의 크기에 따라 할당됩니다 (이는 입력 후).C : scanf 중 동적 할당

현재 내가 입력의 크기를 알고 전에, 그래서 입력을 가진 전에 메모리의 특정 수량을 할당하는 것보다 다른 솔루션을 찾을 수 없습니다 :

char str[10]; 
scanf("%s", str); 

을 그리고 난이 안전하지 않습니다 알고 : 입력하는 경우 10 자보다 길면 프로그램이 할당되지 않은 메모리에 쓰고 segfaults 또는 이와 같은 문제가 발생할 수 있습니다. getline 기능을 사용

+1

원하는 기능을 정확히 수행하지 못하게하는 요인은 무엇입니까? (또한,'str'에 대한 선언은 10 포인터의 배열을 생성합니다. 이것은 아마도 당신이 원하는 것이 아닙니다.) –

+1

사용자 입력에'scanf '를 사용하지 마십시오. – melpomene

+0

@DavidSchwartz 내 기술이 충분히 높지 않습니다. 나는 도서관을 읽으려고했으나 그것에 대해 쓰여진 내용을 거의 이해하지 못했다. (주석 제외) – nounoursnoir

답변

0

,

ssize_t getline(char **lineptr, size_t *n, FILE *stream); 

예는 내가 믿는Try Online

int main(void) 
{ 
    char * line; 
    size_t size; 

    if(getline(&line, &size, stdin) != (-1)) 
    { 
     printf("You entered: %s",line); 
    } 

    return 0; 
} 
의견에서 지적
+0

'readLineString'은 안전하지 못하며 길이가 512 인 정적 버퍼를 사용합니다. 이것은 어떤 식 으로든 동적이지 않습니다. (그런 다음'strdup'의 수동 버전을 실행하지만 그게 무슨 도움이됩니까?) – melpomene

+0

@melpomene 동의합니다. 어떻게 동적 길이로 입력을 읽습니까? –

+1

['getline'] (http://man7.org/linux/man-pages/man3/getdelim.3.html) 게으르다면 휴대 할 필요가 없습니다. – melpomene

1

%의 m은

또 다른 방법가 될 것입니다 귀하의 요청에 해결 입력을 숫자로 제한하라. w와 같이 변수에 할당했습니다. 예를 들어, % 10은 10 문자 만 입력합니다. 다음 번 scanf에서 더 많은 문자를 입력 할 수 있도록 입력 변수를 다시 할당하려면 str을 & str [10]과 같이 전달해야합니다. 이전 입력을 덮어 쓰지 않도록 호출하십시오.

1

stdin의 사용자 입력은 까다 롭습니다.


OP의 "입력이 10자를 넘으면 프로그램이 할당되지 않은 메모리에 쓸 것입니다"라는 문제가 1 개 있습니다. 입력이 보다 길면 프로그램은 할당되지 않은 메모리에 기록합니다. 이 good answer 의해 제안


getline();

char str[10]; 
scanf("%s", str); 

는 일반적인 해결책이다.

좋은 디자인 목표로 "스캔 중에 동적 할당"이라는 아이디어를 거부합니다. 끝이없는 입력을 허용하는 프로그램은 남용되기 쉽습니다. 사용자가 시스템 자원을 압도 할 수 있습니다. 좋은 코드는 입력을 먼저 확인합니다. 더 이상 Heartbleed.

대신 입력 길이 (10, 1000 또는 1,000,000)와 2x 정도의 버퍼가 제공되도록 stdin 입력을 평가하는 것이 좋습니다.

#define MAX_EXPECTED_SIZE 100 
char buf[MAX_EXPECTED_SIZE * 2]; 
if (fgets(buf, sizeof buf, stdin)) { 
    size_t len = strlen(buf); 
    if (len + 1 == sizeof buf && buf[len] != '\n') { 
    // Assume hostile input and act accordingly. Possibly exiting with message. 
    // or consume rest of line 
    int ch; 
    while ((ch = getchar()) != '\n' && ch != EOF); 

    return ERROR_LONG_LINE 
    } 

    // Use buf[] 
} 

코드는 오른쪽 크기의 메모리가 이후에 유지 될 buf 요구의 복사 할당 할 수 있습니다.