【问题标题】:concerning about write function,关于写功能,
【发布时间】:2020-01-27 07:21:46
【问题描述】:

我想显示所有数字,例如“0123456789”

在 Unix 中,我使用 vim 并像这样输入代码


    #include <unistd.h>

     void ft_print_numbers(void)
     {
         int i;

         i=0;
         while(i <= 9)
         {
             write(1, &i, 1);
             i++;
         }

    }

     int main()
     {
         ft_print_numbers();
     }

但是,我看到的结果,什么都没有…… 除了空白我什么都看不到...

我的代码有什么问题?

感谢您的所有帮助。

【问题讨论】:

  • 为了帮助人们帮助您,请edit将显示的文本(不是代码)转换为minimal reproducible example。为此,您需要修复每行开头的数字破坏的语法。请把它们变成 cmets 或删除它们。
  • 欢迎来到 SO。请不要在代码中添加行号。这可以防止它使用 c&p 和编译它。你期望的输出是什么?
  • 按照规则,我不能使用'for'函数,我必须使用'write'函数

标签: c linux unix digits


【解决方案1】:

没有个已知的编码方案,其中整数数字等于它们的字符。

使用最常见的可用编码 ASCII,字符 '0' 的值是整数值48

现在好消息是:C 规范要求所有数字都必须按顺序编码。这意味着'1' 将是49 等,直到'9'57

因此您可以从'0' 循环到'9' 并改为写入该值:

for (int8_t c = '0'; c <= '9'; ++c)
    write(STDOUT_FILENO, &c, 1);

[请注意,我将 magic number 1 更改为符号 STDOUT_FILENO,因为幻数使代码难以阅读、理解和维护]

【讨论】:

  • 感谢您的帮助,但按照规则,我不能使用'for'函数,我必须使用'write'函数
  • @Joseph 然后您只需将for 循环(它不是函数)转换为相应的while 循环。我仍然使用write,只是没有使用幻数1
  • 那么...什么是幻数???这是什么意思?和你所说的STDOUT_FILENO,它是什么?
  • @Joseph 请点击我的问题中的链接。 STDOUT_FILENO 是一个扩展为 1 的预处理器宏,但 1 可能意味着任何特别的东西,STDOUT_FILENO 是可读和可理解的,并且可以立即识别为标准输出 (STDOUT) 文件描述符 (@987654342 @)。
  • @Joseph 短语“幻数”用于描述出现在程序中的数字,无需解释。使用标准定义的预处理器宏使代码更易于阅读并且不会产生额外的运行时开销。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-11
  • 2016-04-03
  • 2010-10-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多