문제는 fgets()
을 사용하는 것입니다. 두 번째로 생각하는 것을 반환하지 않습니다.
처음으로 fgets()
은 line[]
을 "10/23/2014\0"
으로 채우며 모두 양호합니다. 제 fgets()
는 기다리지 않고 "\n\0"
와 line[]
채워도록
그러나 두번째 통해 는 제 fgets()
가 읽어 line[]
어떤 공간이 없어서 키 stdin
의 입력 버퍼에 여전히 입력 새로운 사용자 입력. 따라서 strtok(line, "/")
에 대한 첫 번째 호출은 "\n"
(atoi()
이 0으로 변환 됨)을 반환하고 strtok(NULL, "/")
에 대한 다음 호출이 실패하고 NULL을 반환하여 atoi()
이 segfault가됩니다.
은 fgets()
을 호출 할 때마다 읽혀집니다. 나는 또한 당신이 atoi(strtok())
대신 sscanf()
를 사용하는 것이 좋습니다 :
const size_t max = 16;
void getDate(Date * d)
{
char line[max];
printf("\t Insert the date in the american format (mm/dd/yyyy): ");
fgets(line, max, stdin);
if (sscanf(line, "%d/%d/%d", &(d->month), &(d->day), &(d->year)) != 3)
d->month = d->day = d->year = 0;
}
는 다른 방법으로, 확실히 날짜가 제대로 읽을 수 있도록 몇 가지 추가 검증을 추가 : 당신은 입력 버퍼에서 새 줄을 떠나
const size_t max = 16;
void getDate(Date * d)
{
char line[max];
int consumed;
printf("\t Insert the date in the american format (mm/dd/yyyy): ");
fgets(line, max, stdin);
while (1)
{
if (sscanf(line, "%d/%d/%d%n", &(d->month), &(d->day), &(d->year), &consumed) == 3)
{
if (consumed == strlen(line))
break;
}
printf("\t Invalid input. Insert the date in the american format (mm/dd/yyyy): ");
fgets(line, max, stdin);
}
}
segfault는 메모리 누수가 아닙니다! –
입력 내용은 어떻게됩니까? –