【问题标题】:How to work with char types in Dart? (Print alphabet)如何在 Dart 中使用 char 类型? (打印字母)
【发布时间】:2014-02-06 16:29:50
【问题描述】:

我正在尝试学习Dart language,方法是转换我学校为 C 编程提供的练习。

我们的 C 池中的第一个练习是编写一个函数print_alphabet(),以小写字母打印;禁止直接打印字母

在 POSIX C 中,直接的解决方案是:

#include <unistd.h>

void    print_alphabet(void)
{
    char    c;

    c = 'a';
    while (c <= 'z')
    {
        write(STDOUT_FILENO, &c, 1);
        c++;
    }
}

int     main(void)
{
    print_alphabet();
    return (0);
}

但是,据我所知,当前版本的 Dart (1.1.1) 并没有简单的方法来处理字符。我想出的最远(对于我的第一个版本)是这样的:

void  print_alphabet()
{
  var c = "a".codeUnits.first;
  var i = 0;

  while (++i <= 26)
  {
    print(c.toString());
    c++;
  }
}

void main() {
  print_alphabet();
}

将每个字符的 ASCII 值(每行一个)打印为字符串(“97”...“122”)。不是我想要的……

我正在尝试寻找合适的方法来做到这一点。但是,作为一个初学者,缺少像 C 中那样的 char 类型让我有点困难!

【问题讨论】:

    标签: dart


    【解决方案1】:

    Dart 没有字符类型。

    要将代码点转换为字符串,请使用String 构造函数String.fromCharCode

    int c = "a".codeUnitAt(0);
    int end = "z".codeUnitAt(0);
    while (c <= end) {
      print(String.fromCharCode(c));
      c++;
    }
    

    对于像这样的简单内容,如果您不介意换行,我会使用“print”而不是“stdout”。

    还有:

    int char_a = 'a'.codeUnitAt(0);
    print(String.fromCharCodes(new Iterable.generate(26, (x) => char_a + x)));
    

    或者,使用更新的列表文字语法:

    int char_a = 'a'.codeUnitAt(0);
    int char_z = 'z'.codeUnitAt(0);
    print(String.fromCharCodes([for (var i = char_a; i <= char_z; i++) i]));
    

    【讨论】:

    • 哇,Iterable 类看起来很强大!对我来说这似乎有点矫枉过正,但我​​想你可以用它来做一些在循环语句中需要更长时间的事情。
    • @Irn 这是一个非常强大和快速的。您的 Latin1 示例。我的问题是如何在 ISO 8859-9(“Latin 5”)中做到这一点?
    • 对于非Latin-1 代码页,您需要在字节和Unicode 字符之间进行自己的转换。因为它只有six differences from Latin-1,所以最简单的可能就是检查那些:cpToLatin9(int cp) =&gt; const {0x11e: 0xd0, 0x11f: 0xf0, 0x130: 0xdd, 0x131: 0xfd, 0x15e: 0xde, 0x15f: 0xfe}[cp] ?? cplatin9ToCp(int latin9Char) =&gt; const {0xd0: 0x11e, 0xf0: 0x11f, 0xdd: 0x130, 0xfd: 0x131, 0xde: 0x15e, 0xfe: 0x15f}[latin9Char] ?? latin9Char。当你得到一个 iso08859-9 字节时,你可以使用latin9toCp 来获取它的代码点。
    • 谢谢 Irn 我会在今天晚些时候检查它
    • @Irn 我尝试实现但没有准确捕获。示例在我的 Dart 代码中,我用上面的点表示为 byte[304],我必须用服务器 byte[152] 替换它并作为字节而不是字符串发送到服务器。 cpToLatin9(int cp) 和 latin9ToCp(int latin9Char) 是如何工作的?
    【解决方案2】:

    由于this question about stdout,我正在完成我的帖子并改写我的问题标题,我不再叫错树了。

    似乎书写字符的一种正确方法是使用dart:io库中的stdout.writeCharCode

    import 'dart:io';
    
    void  ft_print_alphabet()
    {
      var c = "a".codeUnits.first;
    
      while (c <= "z".codeUnits.first)
        stdout.writeCharCode(c++);
    }
    
    void main() {
      ft_print_alphabet();
    }
    

    我仍然不知道如何操作字符类型,但至少我可以打印它们。

    【讨论】:

    • 问题:“我仍然不知道如何操作字符类型”,回答:“Dart 没有字符类型。它们只是一个整数。所以你可以像使用整数一样操作它们,因为它们是整数”。
    猜你喜欢
    • 2018-09-09
    • 2021-08-07
    • 2018-08-24
    • 1970-01-01
    • 2015-03-20
    • 1970-01-01
    • 2017-06-27
    • 2021-09-25
    • 1970-01-01
    相关资源
    最近更新 更多