加载丑陋的输入
Loading ugly input
我需要知道如何在 c++ 中加载这样的输入
{ [1, 1], [2, 10] , [-10, 20] }
在C中,我可以写这样的东西:
if ( ( scanf(" %c",&bracket) ) != 1 || bracket != '{') {
printf("Wrong input.n");
return 1;
} // 1st bracket
while(1) {
if ( ( scanf(" %c%d%c%d%c",&bracket1,&arr[index][0],&dot,&arr[index][1],&bracket2) ) != 5 || bracket1 != '[' || bracket2 != ']' || dot != ',') {
printf("Wrong input.n");
return 1;
}
if ( ( scanf(" %c",&tester) ) != 1 || ( tester != ',' && tester != '}' ) ) {
printf("Wrong input.n");
return 1;
}
index++;
if ( tester == '}' )
break;
}
但是我不知道如何在c ++中加载它并修复所有错误的输入。我尝试用 cin 加载它,但它不起作用,也无法用 cin 修复错误的输入。
您必须中断标记(或词素)中的输入。您的输入由 7 种类型的令牌组成:[ ] { } , number end_of_file
.
一个可能的解决方案:
// tokens definition
enum token
{
open_obj,
close_obj,
open_pair,
close_pair,
comma,
number,
end
};
// scanner
class scanner_type
{
std::istream& mis;
public:
token mt;
int mn;
scanner_type( std::istream& ais ) : mis( ais ) {}
token get()
{
std::ws( mis ); // eat white
char c;
if ( ! mis.get( c ) )
return mt = token::end;
switch ( c )
{
case '[': return mt = token::open_pair;
case ']': return mt = token::close_pair;
case '{': return mt = token::open_obj;
case '}': return mt = token::close_obj;
case ',': return mt = token::comma;
default:
if ( std::isdigit( c ) || c == '-' || c == '+' )
{
mis.unget();
mis >> mn;
return mt = token::number;
}
else
{
throw "unexpected character";
}
};
}
};
int main()
{
std::stringstream ss( "{ [1, 1], [2, 10] , [-10, 20] }" );
scanner_type sc( ss );
assert( sc.get() == token::open_obj );
assert( sc.get() == token::open_pair );
assert( sc.get() == token::number );
assert( sc.mn == 1 );
// ...
return 0;
}
在此处阅读有关扫描仪的信息。
相关文章:
- std::原子加载和存储都需要吗
- 如何加载(或映射)文件部分的最大大小,但适合在Windows上的RAM
- C++ 雷神库 - 使用资源加载器类时出现问题(不命名类型)
- 为什么加载SDF会导致Mobilizer创建闭环错误
- C++atioglxx.pdb未加载错误glBufferData OpenGL
- 如何使用tinyxml2从XML加载父实体和子实体
- 如何在C++中使用pybind11加载一个pickle python列表
- 系统.将数组移交给c#中动态加载的c++DLL时发生AccessViolationException
- 当我尝试加载内核模块时,如何修复C++中的这个 malloc() 错误?
- 树莓上的 Libtorch 无法加载 pt 文件,但在 ubuntu 上工作
- Python ctypes:不会按预期加载 dll
- 指定输入/输出节点以在加载C API的模型上在Tensorflow 1.0 中运行推理
- C++简体版链表,当我加载数据以创建链表并输入更多数据时,似乎存在差距
- 将整个输入行加载到程序中
- DirectX Toolkit加载了带有自定义HLSL着色器"顶点"着色器输入签名的模型
- C++将用户输入加载到向量中
- C++ 如何从标准输入加载到最多 5 个字母数字字符的字符数组
- 加载丑陋的输入
- 从输入中加载字符串时的奇怪行为
- qt从资源加载映像:没有输入文件指定错误