0

我在使用 tour.golang.org/methods/23 时遇到了一些问题

package main

import (
    "io"
    "os"
    "strings"
)

type rot13Reader struct {
    r io.Reader
}

func (r rot13Reader) Read(s []byte) (int, error) {
    a, e := r.r.Read(s)
    for i := 0; i < a; i++ {
        if(s[i] >= 'a') {
            s[i] = ((s[i] - 'a') + 13) % 26 + 'a'   
        }
        if(s[i] >= 'A') {
            s[i] = ((s[i] - 'A') + 13) % 26 + 'A'   
        }
    }
    return a, e
}

func main() {
    s := strings.NewReader("Lbh penpxrq gur pbqr!")
    r := rot13Reader{s}
    io.Copy(os.Stdout, &r)
}

我正在添加然后进行修改,但在考虑了小写和大写的 ascii 代码之间的差距后,结果看起来并不完全正确

YHN VKTVDXW MAX VHWX!

4

3 回答 3

1

如果您直接使用字母的 ascii 值,则必须抵消它们。大写 AZ 的 ascii 值为 65-90(含),小写 az 为 97-122(含)。

于 2019-09-13T22:15:19.433 回答
1

'A'是(从数字上讲)65。字母表中更深的字母增加,最多'Z'为90。

'a'是(从数字上讲)97。字母表中更深的字母增加,最多'z'为122。

(不要问我为什么要记住一些 ASCII。我确实必须查找这些z值。:-))

练习1:如果s[i]'a',即97,你rot-13到'n'(110),这是否大于65?当您进行第二次 if陈述时会发生什么?

练习 2:如果s[i]'_'(十进制 95),这里会发生什么?

(你一直在改变你的问题,所以现在这些练习有点没有意义。)

于 2019-09-13T22:31:39.500 回答
0

通过固定字母检查的界限,确保只做字母

'a' 和 'z' 之间以及 'A' 和 'Z' 之间

你的第二个 Z 在需要大写时是小写的

于 2019-09-13T22:30:52.307 回答