2011-03-11 82 views
2

我想從一個文件中讀取一行文本中讀取浮點數(以及後面的整數)。當我調試它的時候,我可以看到它從文件中排除了沒有問題,但是當我嘗試sscanf時,我得到了垃圾。這是我的代碼:關於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中的值是垃圾。爲什麼這不起作用,我怎麼能從這一行中獲得浮動和整數?

回答

5

你」重新包含sscanf調用中的第一個字符(即'v'),所以調用失敗,並且v1保持不變(其中包含垃圾)。試試這個:

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

完美,這解決了我的sscanf問題。謝謝! – Jeff 2011-03-11 19:34:37

+1

而且,v1是垃圾因爲它是未初始化的。檢查sscanf是否實際初始化了你給出的參數,'if(sscanf(line + 1,「%f」,&v1))!= 1){// error}' – nos 2011-03-11 19:38:30

2

推測v1是浮子嗎?

在這種情況下,打印內存中的浮動,如果它是一個「C」的字符串將是壞..
如果符合「V」開始你可能會想嘗試printf("%f",v1);

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

那麼你是發送到scanf並要求它將其轉換爲浮動?你可能想要移動一個字符(或更多,如果你有其他填充),然後開始讀取行[1]處的浮點數?

+0

哈哈,感謝。但那只是用於調試。我真正的問題是v1持有垃圾。任何想法如何我可以解決這個問題? – Jeff 2011-03-11 19:29:52

+0

在實際的代碼中,如果有的話,應該使用strtod() - 它可以標記該字符串是否不是有效的float。看代碼,你需要跳過行'開頭的'v'併發送行[1] sscanf() – 2011-03-11 19:31:39

1

你的printf語句應該是這樣的:

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

此外,你應該檢查的sscanf的返回值來檢查它是否是即使找到和存儲浮動:

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

既然你知道,當你執行sscanf()呼叫在line的第一個字符是字母「V」,你也可以告訴大家,有沒有辦法,sscanf()可以轉換,要想成功a doublefloat,因爲'v'不是以字符串形式表示的任何有效浮點數字的一部分。

您應該檢查sscanf()的返回值;它會說0(沒有成功的轉換),從而告訴你出了什麼問題。

你可能會成功有:

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

感謝您的回覆,您的解釋非常明確。如果我做了像sscanf(線,「%s%f」,v1)這樣的事情會好嗎? – Jeff 2011-03-11 19:36:57

+0

@Jeff:正如所寫的,沒有 - 'sscanf()'會嘗試將字符串複製到可怕的浮動。可能的工作是'sscanf(line,「%* s%f」,&v1);'其中最重要的'*'表示'進行轉換,但不會將其分配給任何地方'。請注意,'%* s'會如果輸入字符串是'v 3.1416'('v'後面的空格),那麼這將工作正常;如果輸入是'v3.1416'或'v + 3。1416'(沒有空格),那麼這個數字將作爲字符串的一部分被使用。 – 2011-03-11 19:39:54

+1

@Jeff - 這會因爲幾個原因而崩潰。首先,你傳遞'v1'而不是'&v1'。其次,你指定了兩種格式轉換,但只給一個地方放置它們。你可以使用'sscanf(line,「v%f」,&v1)''。 – 2011-03-11 19:40:46