【问题标题】:How to output single character in C with write?如何用write在C中输出单个字符?
【发布时间】:2015-08-07 19:39:14
【问题描述】:

有人可以指导我如何在仅使用 write 函数(而不是 printf)的情况下打印单个字母,例如 C 中的“b”。

我很确定它使用了

#include <unistd.h>

你能告诉我写属性是如何工作的吗?不是很懂

int  write(  int  handle,  void  *buffer,  int  nbyte  );

你们中的一些人也能提供一些 C 初学者技巧吗?

我正在使用 UNIX。

【问题讨论】:

  • 没有必要为你的问题道歉。
  • bufferchar myb ='b' 的地址,nbyte 的大小是 1。

标签: c function unix


【解决方案1】:

你已经找到了你的函数,你现在只需要给它适当的参数:

int handle = open("myfile.bin", O_WRONLY);
//... You need to check the result here
int count = write(handle, "b", 1); // Pass a single character
if (count == 1) {
    printf("Success!");
}

我确实想使用标准输出。如何编写一个版本来显示整个字母表?

您可以为标准输出使用预定义的常量。它被称为STDOUT_FILENO

如果你想写出整个字母表,你可以这样做:

for (char c = 'A' ; c <= 'Z' ; c++) {
    write(STDOUT_FILENO, &c, 1);
}

Demo.

【讨论】:

  • 毫无疑问,但仅仅因为提到了printf(),我认为 OP 想要打印到标准输出,而不是文件。在这种情况下,它将是fprintf()。如果我错了,请纠正我。
  • @SouravGhosh 既然你已经提到了,我不确定 OP 是否真的想写入标准输出。
  • 我确实想使用标准输出。上面的答案对我有用,而这个答案却没有。问题 - 我将如何编写版本以显示整个字母表?我知道 char c 等与它有关。另外,什么是“c++;”用于这种情况和大多数情况?
  • 酷! c++ 部分是做什么用的?我在任何地方都找不到它。另外,没有 for 的任何方法都可以做到这一点,并且可能被 while 替换?
  • @ButterMyBitter 这是对字符的增量操作。将for 循环重写为while 循环是一个很好的纯机械练习。尝试独立做是件好事。
【解决方案2】:

让我们看看write()man page,上面写着,

ssize_t write(int fd, const void *buf, size_t count);

说明

write() 从指向buf 的缓冲区中最多写入count 字节到文件描述符fd 所引用的文件。

根据您的要求,您需要传递包含b 的缓冲区地址以打印到标准输出。

让我们一起看一些代码,好吗?

#include <stdio.h>
#include <unistd.h>

int main(void) {
    char  b = 'b';
    write(STDOUT_FILENO, &b, 1);
    return 0;
}

让我解释一下。这里STDOUT_FILENOunistd.h中定义的标准输出文件描述符,&amp;b是包含'b'缓冲区的地址,字节数为1。

【讨论】:

    【解决方案3】:

    同样有效的是:

    #include <stdio.h>
    #include <unistd.h>
    
    int main(void) {
        char  b[1] = {'b'};
        write(STDOUT_FILENO, b, 1);
        return 0;
    }
    

    或者:

    #include <stdio.h>
    #include <unistd.h>
    
    int main(void) {
        char  b[1] = "b";
        write(STDOUT_FILENO, b, 1);
        return 0;
    }
    

    【讨论】:

    • write(STDOUT_FILENO, (char[]){'b'}, 1);
    • @0___________ 他希望它在一个变量中:P
    猜你喜欢
    • 2010-09-23
    • 2022-01-10
    • 2021-02-25
    • 2010-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多