我的输入文件有许多类似于:
的行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()的输入字符数组有多个空格而不是一个空格,那么它也会崩溃吗? (为了消除此错误的可能性,我删除了输入文件中的多个空格。)
修改: 我已经检查了他们首先进行整理的可能性。 (我不是这么大的菜鸟。)这是最初的代码:
string str,useless1,useless2,useless3,useless4,useless5,useless6,useless7,useless8,useless9;
答案 0 :(得分:4)
有什么问题?
编译器 刚刚告诉你 它是什么。
格式
'%s'
需要类型'char *'
,但参数6的类型为'int'
。
因此,字符串中的第6个格式说明符告诉scanf()
期望char *
,但您会传递int
。
无法通过
传递非POD类型'struct std::string'
'...'
的对象
这意味着C ++对象(更确切地说,不是普通旧数据类型的变量)无法传递给可变参数函数。你正试图这样做。它甚至警告你会破坏。
其他评论:
在C ++中,很少使用C函数。你应该坚持使用std::cin
等。为了更好的风格。
但是,如果尽管如此,如果你坚持使用C函数,那么 会让穷人scanf()
单独使用。 它不会无论如何你认为它做什么。使用fgets()
获取一行用户输入,并使用std::stringstream
或在某些<cstring>
或<string.h>
函数的帮助下解析它。
答案 1 :(得分:0)
错误告诉你,useless6
的参数6是int而不是char *
。
此参考资料解释了您无法通过Non-POD to variadic functions
的原因