2016-10-12 7 views
1

I는 다음과 같이 표시되는 파일 (표준 입력이나 파일 중 하나 인) INFILE에서 읽을 fscanf 사용하는 것을 시도하고있다 :독서 쉼표의

1,2,3 
4,5,6 

이 사실을 무시 할 그것들은 숫자입니다 - 저는 그것을 문자열로 표현하고 있습니다. 내가 무슨 짓을

내가 X, Y, Z에 저장됩니다, 각각의 해당 행에 숫자를 나타낸다는 것을 기대하고 있지만,이 작동하지 않습니다

fscanf(infile, "%s%*c %s%*c %s%*c[^\n]", x, y, z); where x, y, z are string variables. 

을 사용했고, 대신 전체를 저장한다 x in line.

도움이 필요하십니까? 감사.

+0

정규 표현식을 검사하는 많은 o 행 도구가 있습니다. http://www.freeformatter.com/regex-tester.html – Asaf

+2

@Asaf'scanf'는 정규 표현식을 사용하지 않습니다. – jamesdlin

+0

'fgets' (또는 사용 가능한 경우 getline)을 사용하여 전체 행을 읽고'strtok'을 사용하여 토큰 화하는 것이 더 나을 것입니다. 'scanf' (와'fscanf')는 올바르게 사용하기가 어렵기로 악명이 높습니다. – jamesdlin

답변

1

'% s'을 (를) 사용하면 전체 단어를 공백까지 읽을 수 있습니다. 따라서 1,2,3은 첫 번째 줄의 경우 x에서 읽습니다. 당신이해야 할 일은

x, yz 정수로, 그럼 당신은 세 개의 정수를 읽을 수 있으며, 다양한 방법 (예를 들어 itoa

int x,y,z; 
char x_str[20], y_str[20], z_str[20]; 
//... 
fscanf(infile, "%d,%d,%d", x, y, z); 
itoa{x,x_str,10); // and so on 
+0

일반화를 잃지 않고 z는 실제로 문자열입니다. 단어와 숫자의 문자열입니다. – TimelordViktorious

+0

그럴 경우'fscanf (infile, "% d, % d, % s", x, y, z_str);를 사용하여 파일의 한 줄을 읽을 수 있습니다. 'z_str'은 문자열이며 직접 읽습니다. –

0

를 사용하여 문자열로 변환 걸릴 당신 해야하는 경우을 사용하면 scanf/fscanf입니다. %s 대신 %[^,]을 입력 포맷터로 사용하려는 경우 %s은 가능한 한 탐욕 적으로 읽습니다 : %[^,]은 문자로 구성된 문자열을 읽습니다 있습니다 (공백 포함)하지 , :

fscanf(infile, "%[^,],%[^,],%[^,]", x, y, z); 

는 문자 수를 제한하는 것은 각각의 문자열로 읽기하지 않기 때문에 fscanf의 위의 사용이 안전하지 않은를 대상이므로주의 마십시오. 따라서 버퍼 오버 플로우 공격에 완전히 취약합니다.


개인적으로, 나는 fgets (또는 getline 가능한 경우)과 전체 라인을 읽을 것이다 다음 strtok,에 그것을 토큰 화. scanf/fscanf are notoriously hard to use correctly이며 일반적으로 피해야합니다.

+0

OP (x, y, z \ n)의 형식이면, "% [^], % [^]], % [^ \ n]"'과 같은 것을 원할 것입니다. 공백은 쉼표 뒤에옵니다. 어느 추측은 당신의 요점을 확인합니다 :) – rici