2012-03-17 2 views
0

sscanf를 사용하여 시간과 분을 목록에서 검색하는 데 어려움을 겪고 있습니다. 아래 목록의 작은 싹둑입니다.어떻게 시간을 sscan합니까?

1704 86 2:30p 5:50p Daily 
1711 17 10:40a 2:15p 5 
1712 86 3:10p 6:30p 1 
1731 48 6:25a 9:30a 156 
1732 100 10:15a 1:30p Daily 
1733 6 2:15p 3:39p Daily 

나는 이것을 시도했지만 세그먼트 오류가 계속 발생합니다. (이 정보를 구조에 넣고 있습니다).

for(i=0;i<check_enter;i++){ 
    sscanf(all_flights[i], 
    "%d %d %d:%d%c %d:%d%c %s", 
    &all_flights_divid[1].flight_number, 
    &all_flights_divid[i].route_id, 
    &all_flights_divid[i].departure_time_hour, 
    &all_flights_divid[i].departure_time_minute, 
    &all_flights_divid[i].departure_time_format, 
    &all_flights_divid[i].arrival_time_minute, 
    &all_flights_divid[i].arrival_time_minute, 
    &all_flights_divid[i].arrival_time_format, 
    &all_flights_divid[i].frequency); 

    printf("%d ",all_flights_divid[i].flight_number); 
    printf("%d ",all_flights_divid[i].route_id); 
    printf("%d ",all_flights_divid[i].departure_time_hour); 
    printf("%d ",all_flights_divid[i].departure_time_minute); 
    printf("%c ",all_flights_divid[i].departure_time_format); 
    printf("%d ",all_flights_divid[i].arrival_time_hour); 
    printf("%d ",all_flights_divid[i].arrival_time_minute); 
    printf("%c ",all_flights_divid[i].arrival_time_format); 
    printf("%s\n",all_flights_divid[i].frequency); 
    } 

이렇게 선언했습니다.

struct all_flights{ 
    int flight_number; 
    int route_id; 
    int departure_time_hour; 
    int departure_time_minute; 
    char departure_time_format; 
    int arrival_time_hour; 
    int arrival_time_minute; 
    char arrival_time_format; 
    char frequency[10]; 
}; 
struct all_flights all_flights_divid[3000]; 

이 내가 sscanf를 출력 대상의 목록을주의 깊게

0 86 2 30 p 0 50 p Daily 
0 17 10 40 a 0 15 p 5 
0 86 3 10 p 0 30 p 1 
0 48 6 25 a 0 30 a 156 
0 100 10 15 a 0 30 p Daily 
0 6 2 15 p 0 39 p Daily 
+3

all_flights_divid 선언을 제공해야합니다. 인수 목록에 몇 개의 앰퍼샌드가 누락 된 것으로 보입니다. 'all_flights_divid [i] .arrival_time_format, ...'팁 : 각 인자 앞에 새로운 라인을 추가하면 더 쉽게 볼 수 있습니다. – stacker

+0

좋아, 방금 내 질문을 업데이트했습니다. –

+0

"timeformat"> all_flights_divid [i] .departure_time_format 필드에 문제가있을 수 있습니다. 구조체에서 departure_time_format이 > char departure_time_format [2]로 선언 된 경우에만 작동합니다. char 배열) 그러면 scanf에 대해 이와 같은 포인터가 필요합니다. > & all_flights_divid [i] .departure_time_format – Soren

답변

2

봐 얻을 결과입니다. &all_flights_divid[i].departure_time_minuteall_flights_divid[i].departure_time_format의 차이점을 보시겠습니까? similary .arrival_time_format.frequency입니다.

& 앰퍼샌드가 무엇이라고 생각하십니까? 힌트 : 단일 함수 호출에서 여러 값을 반환하는 방법은 무엇입니까? & 앰퍼샌드와 관련이있는 것은 무엇입니까?

세그먼트 화 오류는 운영 체제가 CPU가 프로그램에서 사용할 수 있도록 지시하지 않은 메모리에 데이터를 쓰려고 할 때 발생합니다. 데이터가 잘못 배치되면 분할 오류가 발생하지 않는 경우가 있습니다. 데이터가 잘못 배치되는 경우가 있으므로 내에서 사용 가능한 메모리 내에 있습니다. 비유하자면 실수로 책꽂이의 잘못된 위치에 책을 올리면 책을 나중에 쉽게 찾을 수 없지만 책은 책장에 보관되어있어 누구에게도 보이지 않습니다. 다른 한편으로 실수로 냉장고에 같은 책을 넣는다면, 음, 어머니가 우유를 갖러 나갈 때 그녀는 세분화 결함을 일으킬 것입니다! 그것은 어쨌든 비유입니다.

일반적으로 데이터를 잘못 배치하면 프로그램을 실행할 때까지 데이터가 잘못 분류되어 (냉장고에 잘못 놓여 졌는지) 책꽂이에 잘못 배치되었는지를 추측하기 어렵습니다. 세분화 오류 (냉장고)는 실수를 분명히하기 때문에 바람직합니다. 따라서 운영 체제는 가능한 적은 메모리로 프로그램을 제공함으로써 가능한 한 많은 세그먼테이션 오류를 부여하려고 시도합니다.

"숙제"태그로 인해 100 % 직접 답변을 피하고 있습니다. &의 앰퍼샌드를 알아낼 수 없는지 확인한 다음 여전히 의미가 없으면 여기로 돌아와보십시오.

+0

int에 연결할 때'&'만 사용한다고 생각했습니다. 형식은 문자입니다. –

+0

좋아, &를 추가했는데 도움 덕분에 문제가 해결되었습니다. –

+2

음, C에서는 chars는 단지 1 바이트의 부호없는 ints입니다. 또한 C로 포인터를 어지럽히고 싶다면, & 연산자가 무엇을하는지에 대해 강하게 이해해야합니다. 그렇지 않으면이 문제가 많이 있습니다. – FrankieTheKneeMan

0

포인터가 엉망입니다. 이 물건을 읽는 데 필요한 일련의 지역 변수가 아마도이 모든 것을 당신의 머리 속에 정리하는 데 도움이 될 것입니다.

+0

그건 정말 불필요합니다. 유지 관리가 더 어려워집니다. 심지어 코드에 더 많은 문제를 도입했습니다 ... –

+0

불필요한, 아마도,하지만 그것은 실제로 일어나고있는 주위에 그들의 머리를 얻는 데 도움이됩니다. 또한 코드를 유지 관리하기가 더 어렵지 않습니다. 어떤 변수가 있으면 여기에서 읽고있는 변수를 빠르게 읽을 수 있으므로 코드를 쉽게 따라 할 수 있습니다. 그리고 나는 대답을 과대 적재하고 싶지 않았기 때문에 필요한 모든 메모리 관리를 피했다. – FrankieTheKneeMan

관련 문제