2013-03-10 107 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