2013-03-10 94 views
-2

我輸入文件具有類似的許多臺詞:sscanf未知錯誤?

ATOM 339 OP1 DG D 218 72.270 54.958 23.040 1.00 27.52 O 

我想提取的3個座標:72.270 54.958 23.040從每一行。 我已存儲的每一行作爲一個字符串,並使用以下方法來提取座標:

sscanf(protein[j].c_str(),"%s %s %s %s %s %s %f %f %f",useless1,useless2,useless3,useless4,useless5,useless6,&xCord,&yCord,&zCord); 

這裏沒用的是字符串的所有名稱。 這給許多警告和程序崩潰:

warning: format '%s' expects type 'char*', but argument 6 has type 'int'.   
warning: cannot pass objects of non-POD type 'struct std::string' through '...'; call will abort at runtime. 

問題是什麼?

如果它的輸入字符數組有多個空格而不是一個,sscanf()會崩潰嗎? (爲了消除這種錯誤的可能性,我刪除了輸入文件中的多個空格。)

編輯: 我已經檢查過它們是否爲int的可能性。 (我不是這麼大一個小白)。這是最初的代碼:

string str,useless1,useless2,useless3,useless4,useless5,useless6,useless7,useless8,useless9; 
+1

的sscanf是解析任何一個可怕的方式。日內瓦公約應該禁止它的使用。 – 2013-03-10 19:53:26

回答

4

問題是什麼?

編譯器只是告訴你它是什麼。

格式'%s'預計鍵入'char *',但論點6具有鍵入'int'

因此字符串中的第6格式說明符告訴scanf()期待一個char *,但你傳遞一個int代替。

不能通過'...'

這意味着,C++對象(更準確地說,是不普通的舊的數據類型的變量)不能被傳遞給一個可變參數函數傳遞非POD型'struct std::string'的對象。你正在努力做到這一點。它甚至會警告你它會破壞


其他評論:

  1. 在C++中,這是很少建議使用C函數。您通常應該堅持使用std::cin等。爲了更好的風格。

  2. 但是,如果儘管如此,儘管如此,仍堅持使用C函數,單獨留下差scanf()它不會做你認爲它無論如何。使用fgets()獲取一行用戶輸入,並使用std::stringstream或藉助部分<cstring><string.h>函數對其進行解析。

+0

+1對'scanf()'人性化。 – 2013-03-10 21:41:32