【问题标题】:To print something without using cout, printf or puts()在不使用 cout、printf 或 puts() 的情况下打印内容
【发布时间】:2012-12-03 17:26:55
【问题描述】:

我知道了

inline ostream & _Cdecl ostream::operator<< (const signed char * _s) {
    outstr(_s, (const signed char *)0);
    return *this;
}

是在 iostream.h 头文件中声明(重载)插入运算符 (

我试过了

#include<iostream.h>
int main() {
    outstr("Hello world!", (const signed char *)0);
    return 0;
}

结果出错了。我想使用这样的东西来看看是否有一些可能的方法来回答这个在屏幕上打印一些东西而不使用 printf、cout 或 puts() 的查询。

更新:如果您有任何其他建议,我会很欢迎

#include<stdlib.h>
void main() {
    system("echo /"Hello world!/"");
}

注意:如果您可以提供无需 printf()、cout 或 puts() 即可打印的 C 等效代码,我没有任何限制

【问题讨论】:

  • "在 iostream.h 头文件中" --> "在 你的 iostream.h 头文件中"
  • 这样做不会节省大量的操作时间。此外,如果您想在不使用 cout、printf 或 puts 的情况下打印某些内容,您可以尝试的一种解决方案是调用系统调用。
  • @SidR 当您第一次发表评论时,我以为您的意思是向内核的输出例程调用一些特定于系统的函数(一个低级调用,如 printf 或发帖人的 outstr 调用可能会做的)。调用 system() 函数来调用 echo 将是一件可怕的事情,如果 OP 在面试中提出这个建议,他不仅不会得到这份工作,他还会受苦(在这里插入荒谬的夸张) .
  • @SidR 当你调用system() 时,你正在生成一个新进程,如果它的目的只是为了输出一些东西,这是一个非常昂贵的操作。通常(也许总是,我不确定),该进程是一个 shell,然后 shell 将生成第二个进程(对于 echo 命令,在您的情况下),因此成本增加了一倍,这在其单一成本中可能是不可接受的。
  • @mah:感谢您的解释。虽然我承认我的理解并不完美,但我试图回答他询问是否可以在不使用 printf、cout 或 puts() 的情况下打印某些内容的部分。

标签: c++ c


【解决方案1】:

是的,您可以直接调用该函数,但是您这样做的理由是有缺陷的。与执行实际功能所花费的时间相比,通过消除对操作员的子程序调用所节省的时间可以忽略不计;这就像在活动车顶关闭时关闭车窗以减少雨水一样。

【讨论】:

  • 我期待一些可以回答我的查询的东西,而不是对其发表评论。谢谢,如果你能回答它。
  • 你问的问题,从字面上看,是“我可以使用相同的函数在屏幕上打印字符串值吗?”我回答的第一个字就回答了这个问题。您是否打算问为什么您尝试的方法不起作用?如果这是您的意图,最好通过实际询问来实现,但在这种情况下,如果没有更多信息,人们将无法回答(当您尝试时会发生什么,而不仅仅是“不工作” )。
  • 实际上,如果雨不是很大,并且我以 > 60 mph 但低于 75 mph 的速度行驶(确切的速度取决于雨况),并且车顶向下。我的敞篷车内部只有在侧窗关闭时才会变湿。 :-) 对于我们在夏天得到的所有短暂洒水,了解西雅图的哪些内容很有用。
  • 您似乎有很多期望,但是您首先应该期望的不是您实际要求的更多或更少;)也许英语不是您最好的语言,这并没有错(我为之鼓掌您仍然愿意使用它)但是您需要了解,当您的沟通含糊不清或与您实际寻找的内容不同时,您的期望将不会得到满足。除了不相关的评论,@BenjaminLindley 的答案包括三个您尚未排除的有效替代方案。
【解决方案2】:

如果您希望在所有符合标准的 C++ 实现中具有可移植性,您可以通过以下方式将字符串打印到标准输出

const char * str = "Hello World\n";
fprintf(stdout, str);
fputs(str, stdout);
for (int i=0; str[i]!=0; ++i)
    putchar(str[i]);
for (int i=0; str[i]!=0; ++i)
    putc(str[i], stdout);
for (int i=0; str[i]!=0; ++i)
    fputc(str[i], stdout);
fwrite(str, sizeof(*str), strlen(str), stdout);

此外,您可以使用std::cerrstd::clog。他们写信给stderr 而不是stdout,但从用户的角度来看,这通常是同一个地方:

std::cerr << str;
std::clog << str;

从效率的角度来看,我怀疑这些都不会对您有所帮助。为此,您可能希望查看一些更特定于平台的东西。对于 POSIX 系统,请参阅Dave S 给出的答案。对于 Windows,请参阅 this link

你不应该做的是打开你的头文件并模仿他们使用的东西。至少,不是在中间级别,他们在自己的实现中使用不同的各种晦涩功能。这些功能在下一个版本中可能不存在。但是,如果您深入到最深层次,您会发现操作系统特定的调用,就像我在上面提供的链接中的调用一样。只要您使用相同的操作系统,甚至在操作系统版本之间,这些都应该是安全的。

【讨论】:

    【解决方案3】:

    调用函数所需的时间小于打印字符串所需的时间。您可以(通常应该)忽略您的方法可能节省的时间。

    【讨论】:

    • 我想知道这个问题的答案,因为它是在一次采访中被问到的!
    • 这可能是一个技巧问题吗? printfcoutputs 等当然有一些内部实现,但这因操作系统而异,也可能因编译器而异。尝试重新实现标准库函数没有合乎逻辑的理由。
    • 这就是我的方式。如果您有其他方法,您可以提出建议。
    • 我不得不同意@slavik262 的回答,并且我建议在面试中,正确的回答是挑战这个问题(同时也说明你知道的足够深入到较低的级别如果确实需要执行某项操作 - 但同样重要的是要证明您理解为什么它可能不需要并且可能很危险)。
    • inline 关键字与现代编译器中的代码内联关系不大。现代编译器基本上忽略了这个术语(出于内联目的(编译器作者很久以前就发现人类在决定何时内联代码方面非常糟糕)。
    【解决方案4】:

    在 UNIX 类型系统上,您可以执行以下操作。

    #include <unistd.h>
    #include <stdio.h>
    
    int main()
      {
      const char x[] = "Hello World!";
      write(STDOUT_FILENO, x, strlen(x)); // Feel free to check the return value.
      return 0;
      }
    

    我很好奇你这样做的动机是什么。在信号处理程序之外,我不愿意像这样进行较低级别的调用。 I/O 的性能将是时间的主要驱动因素,而不是通常经过大量优化/内联的中间函数调用。

    【讨论】:

    • 我期待在一次采访中被问到的那个问题的答案。就是这样,感谢您的帮助。
    【解决方案5】:

    可以直接使用系统调用。

    http://docs.cs.up.ac.za/programming/asm/derick_tut/syscalls.html

    例如,这个页面解释了 linux 系统调用。你可以从我复制的链接开始,通过汇编使用很多方法,或者换一种说法,不调用它的函数来做某事。

    但我猜这是一个棘手的问题,如果我有一家公司,我永远不会雇用一个使用系统调用而不是函数的人。

    这是一个将 sys_write(4) 与标准输出 (1) 结合使用的示例。您可以将汇编代码内联到您的 C/C++ 代码中。 http://docs.cs.up.ac.za/programming/asm/derick_tut/#helloworld

    【讨论】:

    • @revani- 您提供的第二个链接是纯汇编代码。我期待它的 C 代码。
    • 正如我所说,您可以将汇编内联到 C/C++ 中。在互联网上快速搜索将为您提供足够的信息。
    猜你喜欢
    • 2023-02-16
    • 2020-12-17
    • 1970-01-01
    • 2019-05-25
    • 1970-01-01
    • 1970-01-01
    • 2011-08-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多