2011-04-27 5 views
1

나는 함수를 테스트하기 전에 C 라이브러리를 작성하고 있습니다. 그래서, 다음을 수행하십시오C에서 glib 함수를 사용하여 대화 형 입력 받기

int main(void) 
{ 
GString *msg = NULL; 
msg = g_string_sized_new(256); 
printf ("Insert a string (255 characters at most): "); 
do_fgets((char *) msg->str, (size_t) msg->len, stdin); 
printf("msg->allocated_len = %u \n", (size_t) msg->allocated_len); 
printf("msg->len = %u \n", (size_t) msg->len); 

return 0; 
} 

컴파일이 확인하지만, 프로그램이 다음과 같은 인쇄 : msg-> allocated_len = 512 msg-> 렌 = 0

왜이에게? glib 함수를 사용하여 사용자로부터 대화식 입력을받는 다른 방법이 있습니까?

누군가가 나를 도울 수 있으면 고맙겠습니다!

+0

나는 당신이 원하는 것을 이해하지 못합니다. 어떤 종류의 입력을 원하십니까? GString은 무엇입니까 (기타 문자열 제외)? 편집 : 방금 찾은 것, 표준 ANSI C 함수를 사용하고 싶다고 생각했던 것부터? scanf()를 사용하여 stdin에서 읽을 수 있습니다. –

+2

@Ricardo Ferreira - 기타보다 g-string의 일반적인 사용법이 하나 이상 있습니다. ;) – Duck

답변

1

나는 do_fgets을 가정하고있어 fgets은, 어쨌든 ...

귀하의 코드가 0 바이트 (msg->len의 초기 값)를 읽으려고하기 때문에 실패 포장 자신의 기능입니다. 또한 msg->len은 업데이트되지 않습니다 (값으로 do_fgets에 전달됩니다).

+0

좋아, 내 명확하게 그것을 알려주십시오; do_fgets는 fgets()와 같으므로 잊어 버리고 fgets()를 사용하십시오. GString은 여기에 정의 된 glib.h의 구조체입니다. http://developer.gnome.org/glib/unstable/glib-Strings.html 내가 원하는 것은 사용자로부터 문자열을 읽고 GString-> str에 저장하는 것입니다. . 어떻게하면 len 멤버를 시작할 수 있습니까? 나는 4 호선에서 GString을 할당 할 때 allocated_len 멤버가 512로 설정된다는 것을 이해한다. – xtsop

+0

@xstop : 만약 여러분이'g_string_' * 함수 중 하나를 사용한다면 자동으로 일어난다. 그렇지 않다면'len' 멤버를 문자열의 실제 길이 (종료 문자를 포함하지 않음)로 설정해야합니다. 읽어 들일 바이트 수로'allocated_len'을 사용할 수 있습니다. – Hasturkun

0

재 배출! 제 질문에 대한 해결책을 찾았습니다. 내가 한 것은 버퍼에 대한 입력을 읽고 struct 멤버 src에 버퍼를 할당하는 것이다.

int main(void) 
{ 
    GString *msg = NULL; 
    gchar *p; 
    gchar buf[256]; 
    msg = g_string_sized_new(256); 
    printf ("Enter a message (255 characters at most): "); 
    p = fgets(buf, sizeof(buf), stdin); 
    g_string_assign(msg, buf); 
    printf("msg->str = [%s] \n", (char *) msg->str); 
    printf("msg->len = %u \n", (size_t) msg->len); 
    printf("msg->allocated_len = %u \n", (size_t) msg->allocated_len); 
    return 0; 
} 

은 그래서 출력한다 : 즉 대략 코드의 ... allocated_len 512 대신 답장을 보내 주셔서 모두에게 256 감사 이유

msg->str = [this is my message] 
msg->len = 19 
msg->allocated_len = 512 

유일한 이상한은

+0

다른 질문을 올렸습니다. 어쨌든; GString은 2의 거듭 제곱으로 확장됩니다. g_string_sized_new (256)를 호출하면 256 자의 충분한 공간을 미리 할당하고자 함을 나타냅니다 (내부적으로는 끝에 오는 \ 0 숯에 +1). 이 때문에 257은 2의 가장 가까운 힘 (2^8 -> 2^9)으로 바뀌어 최종 할당 된 512를 만들어 결과를 기대할 수 있습니다. – Wiz

0

부활, 디버깅으로 나를 다음 해결책으로 이끌었습니다. 도와 주셔서 감사합니다. 어제부터 내 답변을 게시하고 싶었지만 신입 회원은 8 시간 전에 질문에 답변 할 수 없습니다. 해결책은 이것이다 :

int main(void) 
{ 
    GString *msg = NULL; 
    gchar *p; 
    gchar buf[256]; 

    msg = g_string_sized_new(256); 
    printf ("Enter a message (255 characters at most): "); 
    p = fgets(buf, sizeof(buf), stdin); 
    g_string_assign(msg, buf); 
    printf("msg->str = [%s] \n", (char *) msg->str); 
    printf("msg->len = %u \n", (size_t) msg->len); 
    printf("msg->allocated_len = %u \n", (size_t) msg->allocated_len); 
} 

그리고 그것은 아주 잘 모두를 출력합니다 ... 당신의 의견을 여러분 모두 감사합니다!