2011-03-11 4 views
2

파일에서 벗어나는 줄에서 float (및 이후의 ints)을 읽으 려합니다. 내가 디버깅 할 때, 파일에서 아무런 문제가없는 줄을 볼 수 있지만, 문제가 생길 때 쓰레기가 나옵니다. 내 코드는 다음과 같습니다.sscanf에 대한 혼동

while(fgets(line, 1000, file) != EOF) 
    { 
     //Get the first character of the line 
     c = line[0]; 

     if(c == 'v') 
     { 
      sscanf(line, "%f", &v1); 
      printf("%f", v1); 
     } 
    } 

v1에 저장된 값은 가비지입니다. 이것이 작동하지 않는 이유는 무엇입니까? 어떻게이 행에서 부유물과 int를 얻을 수 있습니까?

답변

5

당신을 ' sscanf에 대한 호출에서 첫 번째 문자 ('v')를 포함하여 호출이 실패하고 v1이 그대로 유지됩니다 (쓰레기가 포함 된 상태). 당신은 또한 sscanf()가 그 전환에 성공할 수있는 방법이 없다는 것을 알 수 있습니다, 당신은 line의 첫 번째 문자는 문자 '브이'이라는 sscanf() 호출을 실행할 때

sscanf(line+1, "%f", &v1); 
+0

Perfect에 라인 [1]을 보내면 내 sscanf 문제가 해결됩니다. 감사! – Jeff

+1

그리고 v1은 초기화되지 않았기 때문에 쓰레기였습니다. sscanf가 실제로 인자를 초기화했는지 확인하십시오. if (sscanf (line + 1, % f ", & v1))! = 1) {// error}' – nos

2

아마도 v1은 float입니까?

경우 그것은 'C'문자열이 라인은 'V'로 시작하면
당신은 printf("%f",v1);

if(c == 'v') 
    { 
     sscanf(line, "%f", &v1); 

을 시도 할 수도 있습니다 .. 나쁜 될 것입니다 것처럼 메모리에 float를 인쇄에서 그런 다음 scanf로 보내고 그것을 float으로 변환하도록 요청하고 있습니까? 캐릭터 (또는 다른 패딩이있는 경우 더 이상)로 이동 한 다음 라인 [1]에서 플로트 읽기를 시작하고 싶습니까?

+0

하하, 감사 :

당신은에 성공할 수 있습니다. 그러나 그것은 어쨌든 디버깅을위한 것입니다. 내 진짜 문제는 v1가 쓰레기를 보유하고 있다는 것입니다. 내가 그걸 고칠 수있는 어떤 생각? – Jeff

+0

실제 코드에서는 strtod()를 사용해야합니다. 문자열이 유효한 float가 아닌 경우 플래그를 지정할 수 있습니다. 코드를 살펴보면 라인 시작 부분에서 'v'를 건너 뛰고 sscanf() –

1

귀하의 printf 문은 다음과 같아야합니다

printf("%f\n", v1); 

을 또한, 당신은 심지어 플로트 찾아 저장되어 있는지 확인하기 위해 sscanf에서의 반환 값을 확인해야합니다 :

if(sscanf(line, "%f", &v1) < 1){ 
    /* didn't read float */ 
}else{ 
    printf("%f\n", v1); 
} 
1

당신은 알고 있기 때문에 대신이 시도 double 또는 float입니다. 'v'는 문자열로 표시된 유효한 부동 소수점 숫자의 일부가 아니기 때문입니다.

sscanf()의 반환 값을 확인해야합니다. 그것은 0 (아무런 성공적인 변환도 없음)을 말하며, 이로 인해 당신에게 뭔가 잘못되었다는 것을 알려줍니다.

if (sscanf(line+1, "%f", &v1) != 1) 
    ...error... 
+0

답장을 보내 주셔서 감사합니다. sscanf (라인, "% s % f", v1)와 같은 일을했다면 괜찮습니까? – Jeff

+0

@Jeff : 쓰여진대로, 아니요 -'sscanf()'는 문자열을 무시 무시한 float에 복사하려고 시도합니다. 무엇이 효과가 있을지는'sscanf (line, "% * s % f", &v1);'모든 중요한'*'는 '변환을하지만 어디에도 지정하지 않음'을 의미합니다.)'% * s'는 입력 문자열이'v 3.1416' ('v'다음의 공백) 인 경우, 입력이'v3.1416' 또는'v + 3 '인 경우이 작업은 정상적으로 작동합니다.1416 '(공백 없음)이면 숫자가 문자열의 일부로 사용됩니다. –

+1

@ 제프 - 몇 가지 이유로 충돌합니다. 먼저, 당신은'& v1' 대신'v1'을 전달합니다. 둘째, 두 가지 형식 변환을 지정하지만 하나의 위치 만 지정하면됩니다. 'sscanf (line, "v % f", & v1)'를 사용할 수 있습니다. –