2013-05-05 7 views
0

그래서이 코드가 약간 있습니다 (기본적으로 전체 프로그램에 대한 입력).fgets에서 입력 한 내용이 sscanf를 사용하여 제대로 저장되지 않았습니다.

최대 20 자의 문자열 형식이어야하며 두 개의 정수는 모두 공백으로 구분해야합니다. 1 일

int main(void) 
{ 

    int i, x, y; 
    char input[28]; 
    char* name = NULL; 
    fgets(input, 28, stdin); 
    sscanf(input, "%s %i %i", name, &x, &y); 
    printf("%s %i %i\n", name, x, y); 
    return 0; 
} 

예를 들어 마스터는 기본적으로 나는 나중에 연결리스트에 저장되어야로 프로그램이 올바르게 입력을 저장되어 있는지를 인쇄하기 위해 노력하고있어.

모든 것이 정상적으로 작동하지만 입력 한 내용과 관계없이 0 4196064가 출력됩니다. sscanf() 함수의 name에 infront를 넣으면 seg faults가 발생합니다.

이 문제를 해결하는 방법에 대한 아이디어는 많이 알려 드리겠습니다.

답변

1

sscanf는 문자열에 저장소를 할당하지 않습니다.

char name[28]; 

. & 이름이 간접적 인 수준에서 다르므로 seg.fault가 발생합니다. 그러면 당신은 sscanf 내부에서 char *로 해석되는 char * *를 전달합니다. 이름 변수가 스택에 있으므로, & 이름이 스택을 가리 키므로 sscanf가 스택 내용을 덮어 씁니다. 그러면 쉽게 seg.fault가 발생할 수 있습니다.

+0

많은 의미가 있습니다. 아직도 C와 메모리 주위에 내 머리를 감싸하려고했지만 정말 명확히했다. 정말 고마워! – user2334829

0

나는 다음은 문자 포인터로부터 문자 array.Both에, nametype 변경 두려워 다른 :

char name[28]; 

그래서이 더 적합 할 것이다 :

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

int main(void) 
{ 

    int i, x, y; 
    char input[28]; 
    char* name = malloc(28*sizeof(char)); //No need to change type of "name" 
    printf("Enter your stuff\n"); 
    fgets(input, 28, stdin); 
    sscanf(input, "%s %i %i", name, &x, &y); 
    printf("%s %i %i\n", name, x, y); 
    return 0; 
} 

에서 귀하의 코드, namesscanf() 비록 그것에 어떤 메모리를 할당하지 않은 사용하여 작성하려고했습니다. 이것은 seg - 오류가 발생하고 예측할 수없는 출력이됩니다. 위의 코드 012에서은 적절한 크기의 메모리 블록을 할당하는 데 사용되고 주소는 name에 할당됩니다. 그러면 정상적으로 작동합니다.

관련 문제