문제
우리는 파일에서 정보를 가져 와서 배열에 데이터를 저장하는 과제를 받았습니다. 파일의 데이터는 다음과 같이 정렬됩니다
New York 40 43 N 74 01 W
처음 20자는 도시의 이름과 위도와 경도가 뒤 따릅니다. 위도와 경도는 몇 가지가 쉬워야합니다
fscanf(infile, "%d(
또는 %c
내가받는 사람에 따라)", pointer)
작업은 문제가되지 않습니다.
내 문제는 도시 이름 중 일부가 공간을 가지고 있기 때문에 도시 이름으로 끈을 수집하는 방법을 모른다는 것입니다. 나는 구분자를 사용하는 것에 대해 무언가를 읽었지만 읽은 내용에서 전체 줄을 읽는 데 더 많이 사용되는 것 같습니다. 파일에서 도시 이름을 읽고 문자 배열에 공백이있는 전체 이름을 저장할 수있는 방법이 있습니까? 감사.
해결책
scanf()
제한된 양의 문자를 사용할 수 있습니다 "%c"
지정자.
주목 종료 널 바이트를 추가하지 않습니다.
char cityname[21];
scanf("%20c%d%d %c%d%d %c", cityname,
&lat1, &lat2, &lat_letter,
&lon1, &lon2, &lon_letter);
cityname[20] = 0;
그러나 당신은 사용하는 것이 좋습니다 fgets()
문자열을 "수동으로"구문 분석합니다. 그렇지 않으면 종말 문제가 있습니다
다른 팁
여기에 힌트가 있습니다 : 공백이 유일한 구분 기호로 어떻게 말 하시겠습니까? fscanf()
도시 이름이 시작되고 위도가 시작되는 곳은 어디입니까? 당신은 당신의 "전체 라인을 읽는 데 더 많이 사용되는 것 같습니다"와 가까워지고 있습니다. 아마도 그것을 탐구하십시오 fgets()
.
g'day,
첫 번째 숫자, 위도, 도시 이름의 위도까지 스캔 할 때 첫 번째 항목에 대한 숫자가 아닌 사람들을 스캔 할 수 있습니까?
도시 이름에 공간이있는 경우 구분자를 사용하거나 도시 이름 필드를 고정 길이로 정의해야합니다. 그렇지 않으면 "솔트 레이크 시티 (Salt Lake City)"와 같은 3 단어 도시 이름을 구문 분석하려고하면 다음 분야가 죽일 것입니다.
그냥 힌트 : 메모리에서 전체 줄을 읽은 다음 도시 이름의 첫 20 숯을 가져 가십시오.
크기를 지정할 수 있습니다 %c
지정된 크기의 문자 블록을 수집합니다. 귀하의 경우, 도시 이름이 20자인 경우 %20c
라인 형식 내부 scanf
.
그런 다음 끝에 터미네이터를 넣고 문자열을 다듬어야합니다.
"man fgets"에서 :
char *fgets (char *s, int size, file *stream);
FGETS ()는 스트림에서 크기가 가장 적은 문자보다 최대 1 개를 읽고 S가 가리키는 버퍼에 저장합니다. EOF 또는 Newline 이후 읽기 중지됩니다. Newline을 읽으면 버퍼에 저장됩니다. ' 0'은 버퍼의 마지막 문자 다음에 저장됩니다.
FGETS ()는 성공시 S를 반환하고 오류가 발생하거나 문자를 읽지 않은 상태에서 파일 끝이 발생할 때 NULL.
즉, 20 숯불 문자열을 저장하려면 21 숯으로 구성된 숯이 필요합니다 (21st char는 끝에 ' 0'구분 기호가되고 Fgets는 자동으로 제공합니다).
행운을 빕니다!