带字符串的Scanf功能

时间:2012-11-24 18:12:19

标签: c++ scanf

我需要阅读用户的输入。输入值可以是字符串类型或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

3 个答案:

答案 0 :(得分:1)

%s格式的说明符scanf()需要char*,而不是std::string

从C11标准(C ++标准引用它关于C标准库):

  

除了%说明符之外,输入项(或者在%n指令的情况下,    输入字符数)转换为适合转换说明符的类型。如果     输入项不是匹配的序列,指令的执行失败:这    条件是匹配失败。除非用*表示赋值抑制,否则   转换结果放在下面第一个参数指向的对象中    尚未收到转化结果的格式参数。 如果是这个对象   没有合适的类型,或者无法表示转换结果   在对象中,行为未定义

无论如何,这里没有真正的理由偏爱C方式,使用C ++设施。当你使用C库时,使用只能读取给定限制的字符的安全函数(就像fgets或带有宽度说明符的scanf),否则你可能会溢出,再次导致对于未定义的行为,如果运气好的话会出现一些错误。

答案 1 :(得分:0)

这是检查输入结束的非常糟糕的方法。使用整数或使用字符串。

如果您选择字符串,请将转换的条款从string添加到int

我的逻辑是首先检查它是否可以转换为整数。如果可以,那么继续逻辑。如果不能(例如,如果它是floatdouble或其他string),则忽略并继续前进。如果可以,则将其插入Halda的对象中。

旁注:在使用C ++时,请不要使用scanf()printf()

答案 2 :(得分:0)

假设string引用std::sring,则此程序没有定义的行为。你无法真正使用std::string sscanf()你可以在std::string内设置一个缓冲区并读入,但字符串不会改变它的大小。使用std::string的流可能会更好(嗯,在我看来,使用流总是更好)。