为了账号安全,请及时绑定邮箱和手机立即绑定

底线从打印字符串上剪下

底线从打印字符串上剪下

Go
翻过高山走不出你 2022-01-10 10:28:55
我有一个打印多行字符串的程序,它切断了底部。输出:[   ][██████╗  ██╗  ██╗ ██████╗  ██████╗ ][╚════██╗ ██║  ██║ ╚════██╗ ╚════██╗][ █████╔╝ ███████║  █████╔╝  █████╔╝][██╔═══╝  ╚════██║ ██╔═══╝   ╚═══██╗]用于生成它的程序:package mainimport (        "fmt"        "strconv"        "strings")const one = ` ██╗███║╚██║ ██║ ██║ ╚═╝`const two = `██████╗ ╚════██╗ █████╔╝██╔═══╝ ███████╗╚══════╝    `const three = `██████╗ ╚════██╗ █████╔╝ ╚═══██╗██████╔╝╚═════╝ `const four = `██╗  ██╗██║  ██║███████║╚════██║     ██║     ╚═╝`const five = `███████╗██╔════╝███████╗╚════██║███████║╚══════╝`const six = ` ██████╗ ██╔════╝ ███████╗ ██╔═══██╗╚██████╔╝ ╚═════╝ `const seven = `███████╗╚════██║    ██╔╝   ██╔╝    ██║     ╚═╝ `const eight = ` █████╗ ██╔══██╗╚█████╔╝██╔══██╗╚█████╔╝ ╚════╝ `const nine = ` █████╗ ██╔══██╗╚██████║ ╚═══██║ █████╔╝ ╚════╝ `const zero = ` ██████╗ ██╔═████╗██║██╔██║████╔╝██║╚██████╔╝ ╚═════╝ `var numbers = []string{zero, one, two, three, four, five, six, seven, eight, nine}func getAscii(number int) [][]string {        listOfNumbers := strings.Split(strconv.Itoa(number), "")        var ascii [][]string        for _, num := range listOfNumbers {                intnum, _ := strconv.Atoi(num)                ascii = append(ascii, strings.Split(numbers[intnum], "\n"))        }        return ascii}func LongestSlice(slices [][]string) int {        var longest int = 0        for _, slice := range slices {                if len(slice) > longest {                        longest = len(slice)                }        }        return longest}为什么是这样?我很困惑在哪里看。我怎样才能解决这个问题,这样它就不会切断底部?抱歉,我包含了整个程序,我不知道问题出在哪里。
查看完整描述

2 回答

?
慕尼黑5688855

TA贡献1848条经验 获得超2个赞

只是在循环条件下过度工程化。尝试

for lineNumber := 0; lineNumber <= LongestSlice(stuff)-1; lineNumber++ {

在 func joinStrings 的外循环中。看到它有效https://play.golang.org/p/eR4JJtY4T1


查看完整回答
反对 回复 2022-01-10
?
慕村225694

TA贡献1880条经验 获得超4个赞

对于您要完成的工作,您的解决方案似乎过于复杂。一种简单的方法是接受 evanmcdonnal 的建议并使用映射来定义整数如何转换为相应的字符串常量,如下所示:


var integerToStr = map[int]string{

  0: zero,

  1: one,

  2: two,

  3: three,

  4: four,

  5: five,

  6: six,

  7: seven,

  8: eight,

  9: nine,

}

...在这种情况下,您可以像这样转换整数:


if str, present := integerToStr[i]; present {

  // do something with the string

} else {

  // default to something else?

}

如果你不喜欢包范围内的变量,你也可以使用 switch 语句在函数内部做同样的事情:


var glyph string

switch num {

    case "1":

        glyph = one

    case "2":

        glyph = two

    case "3":

        glyph = three

    case "4":

        glyph = four

    case "5":

        glyph = five

    case "6":

        glyph = six

    case "7":

        glyph = seven

    case "8":

        glyph = eight

    case "9":

        glyph = nine

    case "0":

        fallthrough

    default:

        glyph = zero

    }

我还建议为您的字母制定一个标准高度,并将其与字符串本身保持一致。这使您可以通过创建一个固定长度的数组,将每个字符串的相应行附加到该数组的每个成员,然后将其转换为切片并使用“strings.Join”来完成加入最后的字符串:


var out [glyphHeight]string


for _, glyph := range glyphs {

    for i, line := range strings.Split(glyph, "\n") {

        out[i] += " " + line

    }

}


return strings.Join(out[:numGlyphLines], "\n")

我认为值得一提的另一件有点迂腐的事情是,您错误地将字符串称为 ASCII。Go 实际上使用 UTF 作为其字符串。在这个例子中它并不重要,但你应该记住这一点。


查看完整回答
反对 回复 2022-01-10
  • 2 回答
  • 0 关注
  • 206 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号