【发布时间】:2014-02-01 17:58:33
【问题描述】:
我决定使用 sscanf 作为在 C++ 中解析字符串的更简单方法。这是我的代码示例
int x,y,level;
char type;
char *line=NULL;
if(inputMode=='M'){
while(cin.getline(line,200)){
sscanf(line,"(%d,%d,%d,%c)",x,y,level,type);
}
}
我试图从中提取的格式如下所示。我需要提取三个十进制值和 char 值,并且我从中读取的文件的每一行都将具有相同的格式。我创建了一个名为 char line[200] 的 c 字符串。我只是选择了 200 作为任意大小,因为我永远不知道字符串会持续多长时间,只知道在测试时,文件中的最大数字可能是数百万。
(3,2,1,#)
我收到一条错误消息,说 %d 需要一个 int *。所以我认为将 x,y,level 和 type 更改为指针可以解决这个问题,但是编译器说 x,y,level 和 type 可能在函数中未初始化。如果有帮助,我正在使用最新的 g++ -Wall -Werror 进行编译。
【问题讨论】:
-
sscanf(line,"(%d,%d,%d,%c)",&x,&y,&level,&type); -
“我决定使用 sscanf 作为在 C++ 中解析字符串的更简单方法”——这是一个错误的决定。
sscanf()对于初学者来说就像不会游泳的人在 1000 米深的地方潜水一样简单。在 C++ 中,在任何情况下都不应该使用scanf()。我什至不鼓励在 C 中使用它,因为这个函数是错误的。它有很多违反直觉的小怪癖,以至于很难正确使用它。在 C++ 中,使用标准类(std::stringstream、std::string)和函数来解析字符串。在 C 中,使用strtok()、strchr()等。 -
好的,谢谢,因为我已经合并了 stringstream,所以我会看看它
-
另外,在 Stack Overflow 上发帖之前,请阅读一些关于该语言的初学者教材。这是非常基本的,我什至不明白你怎么可能可能错过这个。你显然没有学习基础教程或书籍,是吗。就目前而言,您似乎甚至不了解指针是什么,为什么
scanf()需要指针,并且您似乎不知道将参数传递给函数是如何工作的。这是一个严重的问题。 -
我实际上做了,我看到的例子,没有使用 & 符号