2013-09-01 4 views
1

영어가 모국어가 아닌 이유로 사과하고 싶습니다. 제 모국어가 아닙니다.stdout에서 읽고 문자열을 얻으십시오

그래서 제 질문은 여기에 있습니다. C 언어로 내 stdout에서 읽고 어떤 내용이든 *char으로 바꾸는 방법이 있습니까? 읽기, 쓰기, malloc 및 free 함수 만 사용할 수 있습니다.

내 실제 코드는이

char* acquire_shape() 
{ 
    char *buffer[BUF_SIZE + 1]; 
    int ret; 

    ret = read(0, buffer, BUF_SIZE) 
    buffer[ret] = '\0'; 
    return *buffer; 
} 

처럼 보이지만 나는 문자열로 그것을 얻을 수 없습니다.

char* acquire_shape(int fd) { 
    char *buffer = malloc(BUF_SIZE + 1); 
    int ret; 

    if (buffer == NULL) 
     return NULL; 

    ret = read(fd, buffer, BUF_SIZE); 
    buffer[ret] = '\0'; 
    return buffer; 
} 
+0

이것은 문자열이 아닙니다. 그것의 포인터 배열. 일반적으로'char buffer [BUF_SIZE + 1];을 사용합니다. 동적 할당이 필요할 것 같습니다. 왜냐하면 * 어딘가에서 이것을 반환하기 때문입니다. 그리고 귀하의 디스크립터를 하드 코딩 하시겠습니까? 나쁜 생각. – WhozCraig

+0

하드 코딩 설명자에서 그 부분을 얻지 못했습니다. 무슨 소리 야? – zubergu

답변

0

주, 당신은 free를 사용하여 어느 시점에서 malloc에 할당 된 메모리를 해제 할 필요가 (함수가 반환 된 후에는 정의되지 않음).

char* acquire_shape(char *buffer) 
{ 
    int ret; 

    ret = read(0, buffer, BUF_SIZE) 
    buffer[ret] = '\0'; 
    return *buffer; 
} 

과 같이 호출 : 가장 좋은 방법은 다음과 같이 당신의 기능을 변경하는 것입니다

char mybuffer[BUF_SIZE + 1]; 
    acquire_shape(mybyffer); 
0

char buffer[BUF_SIZE + 1];는 거의 의미하는 것입니다 ... 그것은 로컬 스토리지에 대한 포인터이기 때문에 당신이 제대로 돌아갈 수 없습니다 제외 :

0

문자 *buffer[BUF_SIZE + 1];의 선언은 char 형에 대한 포인터가 아니라 포인터 아니다 char 형의 포인터에 저장한다. 당신은 숯불에 대한 포인터를 만들려면 당신은 당신의 버퍼 메모리를 할당해야합니다

char *buf = (char *) malloc(BUFSIZE + 1); 

if (buf == NULL) 
    return NULL; 

그런 다음 코드 샘플에서 buffer 변수를 사용하는 방법을 정확하게 변수 buf를 사용할 수 있습니다.

+0

'malloc'의 결과를 캐스팅하지 마십시오. C++에서는 필요하지만 C에서는 [나쁜 연습으로 간주됩니다] (http://stackoverflow.com/questions/605845/do-i-cast-the-result-of-malloc). –

관련 문제