sscanf未知错误?

时间:2013-03-10 19:51:33

标签: c++ file input formatting

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

的行
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;

2 个答案:

答案 0 :(得分:4)

  

有什么问题?

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

  

格式'%s'需要类型'char *',但参数6的类型为'int'

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

  

无法通过'struct std::string'

传递非POD类型'...'的对象

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


其他评论:

  1. 在C ++中,很少使用C函数。你应该坚持使用std::cin等。为了更好的风格。

  2. 但是,如果尽管如此,如果你坚持使用C函数,那么 会让穷人scanf()单独使用。 它不会无论如何你认为它做什么。使用fgets()获取一行用户输入,并使用std::stringstream或在某些<cstring><string.h>函数的帮助下解析它。

答案 1 :(得分:0)

错误告诉你,useless6的参数6是int而不是char *

此参考资料解释了您无法通过Non-POD to variadic functions

的原因
相关问题