【问题标题】:Print the next letter by increasing their ascii code in c# [closed]通过在 c# 中增加它们的 ascii 代码来打印下一个字母 [关闭]
【发布时间】:2017-02-18 00:11:01
【问题描述】:

我可以有算法来解决这个程序吗?

编写一个程序,其中用户将字符串作为输入,并使用其 ASCII 值递增字符串的每个字母,并在控制台应用程序 C# 中打印输出。

(就像用户输入 Abcd 一样,它会打印 Bcde。)

【问题讨论】:

  • 很遗憾,SO 不是代码编写工厂。
  • 给我一些算法,这样我就可以编写这个程序了。
  • 我应该使用字符串生成器来解决这个问题吗?
  • 算法:遍历字符串,抓取索引i处的字符,找到它的ASCII码,增加,转换回来,写入字符串。

标签: c# string ascii console-application


【解决方案1】:

.NET 中的字符串是 UTF-16 代码单元的序列。 (Java、JavaScript、HTML、XML、XSL、Windows API 等也是如此)字符串的 .NET 数据类型是 String,UTF-16 代码单元的 .NET 数据类型是 Char。在 C# 中,您可以使用它们或其关键字别名 stringchar

UTF-16 是 Unicode 字符集的几种编码之一。它将每个 Unicode 代码点编码为一个或两个代码单元。当使用两个代码单元时,它们被称为代理对,按顺序是高代理,然后是低代理。

ASCII 是 Unicode 的一个子集。与 ASCII 相同的 Unicode 字符正好是 U+0000 到 U+007F。 UTF-16 将它们分别编码为一个代码单元:'\u0000' 到 '\u007F'。 ASCII 字符集的单一编码将每个字符编码为一个字节:0x00 到 0x7f。


问题陈述涉及“string”、“alphabet”、“ASCII”、“C#”和“console”。这些中的每一个都必须被理解。

不幸的是,有些人使用“ASCII”来表示“字符代码”。在“C#”“字符串”的上下文中,字符代码表示 Unicode 代码点或 UTF-16 代码单元。您可以做一个简化的假设,即输入字符不需要 UTF-16 代理对,甚至范围是 U+0000 到 U+007F。

“字母”既是一个数学术语,也是一个语言术语。在数学(和计算机科学)中,“字母表”是一组象征性的事物,通常有顺序。在语言学中,“字母表”是在特定语言的书写系统中使用的一系列基本字母。它通常由“语言学院”定义,可能包括也可能不包括该语言中使用的所有字母形式。例如,公认的英文字母不包括带有任何变音符号或重音符号或连字的字母,即使它们用于英文单词。此外,在书写系统中,部分或全部字母可以有大写、小写、首字母大写或其他形式。对于这个问题,由于提到了 ASCII 并且 ASCII 包含大写和小写的基本拉丁字母,您可以定义两个技术字母 A-Z 和 a-z,按它们的 UTF-16 代码单元值排序。

由于您想为字母表中的每个字符增加字符代码,因此您必须决定如果结果不再在您的字母表中会发生什么。结果是否真的是一个字符,因为肯定有最后一个可能的字符(或许多不同的 UTF-16 代码单元范围)?您可能会考虑环绕到字母表中的第一个字符。 Z->A,z->a。

最后是“控制台”。控制台具有字符编码设置。 (去chcp 看看你的是什么。)你的程序将从控制台读取和写入。当你写入它时,它会使用一种字体来生成接收到的字符的图像。如果一切顺利,那就太好了。如果没有,您可以询问有关它的问题。底线:当程序读写时,输入/输出函数进行编码转换。因此,在您的程序中,StringChar 的编码是 UTF-16。


现在,StringChar 的序列,因此您可以使用多种分解技术,包括 foreach

foreach (Char c in inputString)
{
    if (Char.IsSurrogate(c)) throw new ArgumentOutOfRangeException();
    if (c > '\u007f') throw new ArgumentOutOfRangeException();

    // add your logic to increment c and save or output it
}

【讨论】:

  • 这是一个非常好的和完整的答案,它着眼于问题的各个方面 - 喜欢它。尽管我担心在这个可能与家庭作业相关的问题上有点浪费。不过,对于偶然来到这里的人来说,这可能非常有用 - 所以我还想介绍 Joel Spolsky 对 Unicode 和字符集的出色介绍:joelonsoftware.com/articles/Unicode.html
  • @BernhardKönig 感谢您的反馈。 Joel 的文章很有趣,但我想知道如果新程序员首先学习 Unicode BMP UTF-16 并且仅在被正在研究的 IETF RFC 调用时才学习 ASCII 会发生什么。没有现代编程语言或操作系统使用 ASCII 字符集本身——甚至 MS-DOS。
  • 这是非常好的解释。真的很感激。
【解决方案2】:

一种简单易懂的方法:

byte[] bytes = System.Text.Encoding.ASCII.GetBytes("abcd".ToCharArray());

for (int i = 0; i <= bytes.GetUpperBound(0); i++)
{
    bytes[i]++;
}

Console.WriteLine(System.Text.Encoding.ASCII.GetString(bytes));

【讨论】:

    【解决方案3】:

    一种可能的解决方案是将字符串转换为字符数组,然后遍历该数组。

    对于数组中的每个元素,将值加一并转换回字符类型。 (基本上这会起作用,因为根据 ASCII 表,对于具有值限制的 char 而言,char 和 int 是相同的,并且计算机可以将图像与 char 相关联)

    我希望这回答了你的问题。

    【讨论】:

    • 不转ASCII码可以吗?
    • 将字母转换为 ASCII 码,以便进行增量。
    猜你喜欢
    • 1970-01-01
    • 2016-03-02
    • 2016-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多