我需要阅读用户的输入。输入值可以是字符串类型或int
类型。
如果值为int
,则程序将值插入到我的对象中。
否则,如果值是字符串,那么它应检查该字符串的值,如果它是“结束”,则程序结束。
Halda h; //my object
string t;
int tint;
bool end=false;
while(end!=true)
{
if(scanf("%d",&tint)==1)
{
h.insert(tint);
}
else if(scanf("%s",t)==1)
{
if(t=="end")
end=true;
else if(t=="next")
if(h.empty()==false)
printf("%d\n",h.pop());
else
printf("-1\n");
}
}
问题是扫描字符串似乎无法正常工作。
我试图将其更改为:if(cin>>t)
并且效果很好。
我需要使用scanf
。
答案 0 :(得分:1)
%s
格式的说明符scanf()
需要char*
,而不是std::string
。
从C11标准(C ++标准引用它关于C标准库):
除了%说明符之外,输入项(或者在%n指令的情况下, 输入字符数)转换为适合转换说明符的类型。如果 输入项不是匹配的序列,指令的执行失败:这 条件是匹配失败。除非用*表示赋值抑制,否则 转换结果放在下面第一个参数指向的对象中 尚未收到转化结果的格式参数。 如果是这个对象 没有合适的类型,或者无法表示转换结果 在对象中,行为未定义。
无论如何,这里没有真正的理由偏爱C方式,使用C ++设施。当你使用C库时,使用只能读取给定限制的字符的安全函数(就像fgets
或带有宽度说明符的scanf
),否则你可能会溢出,再次导致对于未定义的行为,如果运气好的话会出现一些错误。
答案 1 :(得分:0)
这是检查输入结束的非常糟糕的方法。使用整数或使用字符串。
如果您选择字符串,请将转换的条款从string
添加到int
。
我的逻辑是首先检查它是否可以转换为整数。如果可以,那么继续逻辑。如果不能(例如,如果它是float
或double
或其他string
),则忽略并继续前进。如果可以,则将其插入Halda
的对象中。
旁注:在使用C ++时,请不要使用scanf()
和printf()
。
答案 2 :(得分:0)
假设string
引用std::sring
,则此程序没有定义的行为。你无法真正使用std::string
sscanf()
你可以在std::string
内设置一个缓冲区并读入,但字符串不会改变它的大小。使用std::string
的流可能会更好(嗯,在我看来,使用流总是更好)。