2014-10-23 4 views
-2

나는 char enterComponent() 함수가 있고 문자열 name, 사용자에게 요청한 다음 호출 한 위치에 이름을 반환 할 싶습니다. C에서 함수를 사용하여 문자열을 반환하는 데 문제가

내가

char enterComponent(){ 
    char name[8]; 
    printf(" enter next component name: "); 
    sscanf("%s", &name); 
    return name;  
} 

이 코드이며,이 사람이 내가 여기서 뭘 잘못했는지 말해 줄 수 있는지 궁금

warning: format not a string literal and no format arguments [-Wformat-security] 
warning: return makes integer from pointer without a cast [enabled by default] 
warning: function returns address of local variable [-Wreturn-local-addr] 

디버거가 나에게 말해 것입니다.

답변

1

자동 저장 기간이있는 객체에 대한 포인터를 반환하지 말고 scanf을 사용하여 stdin에서 문자열을 읽습니다. 이 방법으로 호출 할 수있는

void enterComponent(char *name) 
{ 
    printf(" enter next component name: "); 
    scanf("%s", name); 
} 

:

은 기본적으로 기능을 변경

char name[256]; // reserve enough space, use fgets/sscanf for safety 

enterComponent(name); 

printf("%s\n", name); // prints your string 
+0

'static char name []'도 올바르게 작동할까요? – tesseract

+2

@tesseract 가능한 한 정적 인 객체를 피하는 것이 가장 좋은 방법입니다. – ouah

0

당신의 함수는 하나의 문자를 반환으로 정의된다. char *을 반환해야합니다. 그러나 로컬 변수 name은 스택에 할당되므로 반환하지 않아야하며 enterComponent()를 호출하는 함수가 다른 호출을하면 덮어 씁니다. 어느 쪽이든 당신은 입력 된 값을 반환하는 함수에 버퍼를 전달하거나 반환 값 malloc 메모리 (나중에 free 그것을 잊지 마세요!)

0

이 제대로 기능을 선언해야 그것이를 동적으로 할당 된 문자 배열에 대한 포인터를 반환합니다. 당신은 예를 들어, 같은 N을 정의 할 수 있습니다 예를 들어 물론 examoke

char * enterComponent() 
{ 
    const size_t N = 8; 
    char *name = malloc(N * sizeof(char)); 

    printf(" enter next component name: "); 

    if (name) fgets(name, N, stdin); 

    return name;  
} 

위해 당신은, 8 개 이상의 문자를 할당 할 수있다 (50)

이 필요하지 wiil 때

반환 된 포인터를 해제하는 것을 잊지 마세요 더 이상 .

free(name); 
+0

도움 주셔서 감사합니다. 나는 그것을 조사하고 왜 다음의 구성 요소 이름을 입력하는지 궁금해한다. ""다음 구성 요소 이름을 입력하십시오 : "이 함수가 처음으로 호출 될 때 두 번. 그러나 그 후에는 한 번만 인쇄됩니다. – johnnyboyyy

+0

@johnnyboyyy이 메시지는 두 번 인쇄되기 때문에 나타납니다 : 함수 호출 전과 함수 본문 내부. –

관련 문제