2

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

4

3 回答 3

1

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

来自 C11 标准(C++ 标准参考它关于 C 标准库):

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

无论如何,这里没有真正的理由更喜欢 C 方式,使用 C++ 工具。并且当您使用 C 库时,请使用仅读取到给定限制的字符(就像fgets,或scanf使用宽度说明符)的安全函数,否则您可能会溢出,这会再次导致未定义的行为,如果您'重新运气。

于 2012-11-24T18:20:55.000 回答
0

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

如果您选择字符串,请准备好从转换stringint.

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

旁注:不要在使用 C++ 时使用scanf()and 。printf()

于 2012-11-24T18:20:53.587 回答
0

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

于 2012-11-24T18:21:26.840 回答