-2

我的输入文件有很多类似于:

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.

问题是什么?

如果输入 char 数组有多个空格而不是一个空格,sscanf() 也会崩溃吗?(为了消除此错误的可能性,我删除了输入文件中的多个空格。)

编辑:我首先检查了它们是整数的可能性。(我不是那么大的菜鸟。)这是初始代码:

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

2 回答 2

4

问题是什么?

编译器只是告诉你它是什么。

format'%s'需要 type 'char *',但参数 6 有 type 'int'

因此,字符串中的第 6 个格式说明符告诉scanf()我们期望 a char *,但您传递的是a int

不能通过非 POD 类型的'struct std::string'对象'...'

这意味着 C++ 对象(更准确地说,不是普通旧数据类型的变量)不能传递给可变参数函数。而你正在尝试这样做。它甚至警告你它会坏掉。


其他的建议:

  1. 在 C++ 中,很少建议使用 C 函数。您通常应该坚持使用std::cinet al。为了更好的风格。

  2. 然而,如果你尽管如此,仍然坚持使用 C 函数,那就别管穷人scanf()了。无论如何,它不会做你认为它会做的事情。使用 获取一行用户输入fgets(),并使用其中一个或在某些或函数std::stringstream的帮助下对其进行解析。<cstring><string.h>

于 2013-03-10T19:56:12.550 回答
0

该错误告诉您参数六是useless6int 而不是 a char *

此参考解释了为什么不能将非 POD 传递给可变参数函数

于 2013-03-10T19:56:44.340 回答