문제

우리는 파일에서 정보를 가져 와서 배열에 데이터를 저장하는 과제를 받았습니다. 파일의 데이터는 다음과 같이 정렬됩니다

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는 자동으로 제공합니다).

행운을 빕니다!

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top