簡體   English   中英

不使用 cout、printf 或 puts() 打印內容

[英]To print something without using cout, printf or puts()

我了解到

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

是在 iostream.h header 文件中聲明(重載)插入運算符 (<<) 的方式。 我可以使用相同的 function 在屏幕上打印字符串值嗎?

我試過了

#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 等效代碼,我沒有任何限制

是的,您可以直接調用該函數,但是您的推理是有缺陷的。 與執行實際功能所用的時間相比,通過消除對操作員的子程序調用來節省的時間可以忽略不計; 這就像關閉汽車的窗戶,而敞篷車頂下,以減少雨。

做一個函數調用所需的時間是多少 ,比所需的時間來打印字符串量小得多。 使用您的方法可以節省的時間量(通常應該)可以忽略。

如果您希望在所有符合標准的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,請參閱此鏈接

你不應該做的是打開你的頭文件並模仿他們使用的東西。 至少,不是在中間層,他們在自己的實現中使用不同的各種模糊功能。 下一版本可能不存在這些功能。 但是,如果你進入最深層次,你會發現特定於操作系統的調用,就像我上面提供的鏈接中那樣。 只要您停留在相同的操作系統,甚至操作系統版本之間,那些應該是安全的。

在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的性能將是時間的主要驅動因素,而不是通常相當大優化/內聯的中間函數調用。

您可以直接使用系統調用。

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

例如,該頁面解釋了linux系統調用。 你可以從我復制的鏈接開始,使用匯編使用很多方法,或者用另一種方式說出來,不用調用函數就可以做一些事情。

但我猜這是一個棘手的問題,如果我有一家公司,我絕不會雇用一個使用系統調用而不是函數的人。

這是使用帶有標准輸出(1)的sys_write(4)的示例。 您可以將匯編代碼內聯到C / C ++代碼中。 http://docs.cs.up.ac.za/programming/asm/derick_tut/#helloworld

提取運算符在 ostream class 中過載。因此,如果沒有 class 的 object,您將無法實際使用它。

它是通過以下方式實現的:

cout<<"Hii"; 

相當於:

cout.operator<<("Hii")

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM