sscanf未知错误

sscanf unknown error?

本文关键字:错误 未知 sscanf      更新时间:2023-10-16

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

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

我想从每一行中提取三个坐标: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.

问题出在哪里?

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

编辑:我先检查了它们是int的可能性。(我不是一个大傻瓜。(这是初始代码:

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

问题出在哪里?

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

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

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

无法通过'...' 传递非POD类型'struct std::string'的对象

这意味着C++对象(更准确地说,不是普通旧数据类型的变量(不能传递给变元函数。而你正试图做到这一点。它甚至警告你它将崩溃


其他评论:

  1. 在C++中,很少建议使用C函数。为了获得更好的风格,您通常应该使用std::cin等。

  2. 然而,如果您尽管有以上所有内容,但仍坚持使用C函数,则就别管糟糕的scanf()它不会做你认为它会做的事。使用fgets()获取一行用户输入,并使用std::stringstream或借助某些<cstring><string.h>函数对其进行解析。

错误告诉您参数6(即useless6(是int而不是char *

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