【问题标题】:?: operator on sprintf?: sprintf 上的运算符
【发布时间】:2011-07-03 08:39:11
【问题描述】:

显然,过多的 Python 或过多的任何动态类型语言对程序员来说都是不健康的。无论如何,我正在努力进行 C++ 练习,并且有一个关于语法的快速问题。我找不到任何应用它的源代码(如果可能的话)。

我可以使用包含 ?: 运算符作为 sprintf 参数的语句吗?这是我的不编译代码,所以你明白了:

return sprintf("The cosine of %2f %s is %2f", angle, (angleType == "g" ? "degrees" : "radians"), result);

angleType 是用户输入的值,指定他输入的是度数还是弧度。

角度是角度的值。

结果是实际的余弦值。

我想打印一条尽可能具有描述性的消息,所以我想出了这个。

如果可能的话?

谢谢!

【问题讨论】:

  • angleType 字符还是字符串? angleType == 'g' 更有意义
  • angleType 是 std::string
  • 另外,永远不要使用sprintf 始终使用snprintf(或者在不可用的情况下,_snprintf)。 sprintf 很可能是比任何其他 C 标准库函数更多的缓冲区溢出攻击向量的原因。
  • @Martin:怎么样?他甚至没有正确使用sprintfsprintf 不返回字符串;它打印到您指定的缓冲区,而他没有指定缓冲区。

标签: c++ printf logical-operators


【解决方案1】:

是的,您可以在任何需要表达式的地方使用?:

您的问题之一可能是条件angleType == "g"。在 C 和 C++ 中,您不能像这样比较字符串;你需要使用strcmp 或类似的东西。除非angleTypestd::string,在这种情况下应该可以正常工作。

另一个问题是您似乎期望sprintf 返回一个字符串。相反,负责向它传递一个字符串,然后它将其输出写入该字符串。不过既然是C++,还是用std::string比较好!

如果这不能解决您的问题,请发布您的编译器错误消息!

【讨论】:

  • strcmp 不起作用......但正如你提到的,我正在使用 std::string,或者至少我相信我这样做。 #include <string.h> 然后using namespace std;。变量声明为string angleType;
  • 这里是编译器消息,在我使用 ?: 的线上无法将参数 '2' 的 'double' 转换为 'const char*' 到 'int sprintf(char*, const char*, .. .)'
  • 是的,这与我提到的第二个问题有关。您需要传递 两个 字符串参数:输出字符串和格式字符串。这里,“string”表示 C 风格的字符串,即指向 chars 数组的指针。甚至不要使用带有 C++ 字符串的sprintf 作为其输出。最好使用std::ostringstream 进行这种格式化工作。
【解决方案2】:

第一个问题,再看sprintf(3)中的原型:

   int sprintf(char *str, const char *format, ...);

第一个参数是sprintf(3) 写入的缓冲区。你已经给了它格式字符串。

第二个问题:angleType == "g" -- C 中的字符串比较不能这样工作。如果angleTypechar== 'g' 会起作用。或者,如果您确信您有 C++ std::string,当然可以,但仅此行没有该数据。

【讨论】:

  • 对!我错过了第一个论点。将其更改为char buffer[50],作为文档示例。现在它可以编译了,但是有一个警告:warning: deprecated conversion from string constant to ‘char*’ On execution会给Segmentation Fault到达有问题的行!
  • @horhay.romero 您现在是否将 char[50] 作为第一个或第二个参数传递?将常量字符串作为第一个参数会导致此警告和运行时异常。如果不是这种情况,请为您的后续问题发布一些代码。
  • @horhay,我认为警告来自 C++ 更喜欢 "strings"std::string 而不是 C 的 char *(但我经常与 C++ 脱节)。 char buffer[50] 是自动分配的变量,它超出了return ... 语句的范围吗?您需要 malloc(3)new 该缓冲区(或从称为 this 函数的任何函数提供它),以便在此函数结束后可以取消引用。
  • @eran 是对的。当字符串文字作为第一个参数(应该是char buffer[50])传递时,就会发生转换。尝试覆盖 "The cosine of %2f %s is %2f" 字符串文字时会发生段错误。
【解决方案3】:

我认为这是您的代码的问题:angleType == "g",如果我猜对了,那 angleType 是 char*,而不是 std::string。换成strcmp(angleType, "g") == 0试试看是否正确。

我认为 ?: 没有任何问题,它唯一的限制是两个结果必须是相同的类型。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-07-22
    • 2017-12-27
    • 1970-01-01
    • 1970-01-01
    • 2018-10-16
    • 1970-01-01
    • 2015-06-11
    相关资源
    最近更新 更多