【问题标题】:Difficulty in eliminating the "\ n" as a string delimiter. (Golang)难以消除将“\n”作为字符串分隔符。 (哥朗)
【发布时间】:2021-05-04 19:46:13
【问题描述】:

当从键盘读取字符串时,我正在努力删除“\ n”作为字符串分隔符。目标是识别键盘输入接收到的字符串的最后一个字母。

但事实证明,他没有将“n”标识为最后一个字母。我认为他将“\n”保存为最后一个输入。

测试:尝试写“ian”会导致“找不到”。

注意:我已经尝试使用“TrimSuffix”功能,但没有解决问题。

package main

import (
    "bufio"
    "fmt"
    "os"
    "strings"
)

func main() {

    str := bufio.NewReader(os.Stdin)

    fmt.Println("Please enter a string:")

    strReciv, _ := str.ReadString('\n')

    //---------------------------------------------

    s1 := strings.HasPrefix(strReciv, "i")
    s2 := strings.Contains(strReciv, "a")
    s3 := strings.HasSuffix(strReciv, "n")

    if s1 && s2 && s3 {

        fmt.Println("Found!")
    } else {
        fmt.Println("Not Found")
    }

}

【问题讨论】:

  • 是的,ReadString 的文档说:“返回一个字符串,其中包含直到并包括分隔符的数据”。为什么TrimSuffix 不起作用?你试过TrimSpace吗?
  • TrimSpace 删除空格,我不想要那个,我只想在最后删除“\n”。我做了一个测试,将分隔符交换为“”(空格)并工作,他将“n”识别为最后一个字母。我不知道为什么当分隔符是“\n”时,他一直看不到“n”。
  • ReadString 返回字符串末尾的分隔符。如果我输入“ian”并单击“Enter”,在我的 Linux 机器上,strReciv 的字节表示为[105 97 110 10],其中 10 是最后的 LF(换行符)。这就是您的测试 s3 失败的原因 - 后缀不是“n”,而是换行符“\n”。
  • @EliBendersky,是的,这是我发现行不通的结论。现在我需要找到一种方法来删除s3 的最后一个“输入”。

标签: go


【解决方案1】:

strings.Trim 对我有用,如图所示

package main

import (
    "bufio"
    "fmt"
    "os"
    "strings"
)

func main() {

    str := bufio.NewReader(os.Stdin)

    fmt.Println("Please enter a string:")

    sin, _ := str.ReadString('\n')
    strReciv := strings.Trim(sin, "\n")

    //---------------------------------------------

    s1 := strings.HasPrefix(strReciv, "i")
    s2 := strings.Contains(strReciv, "a")
    s3 := strings.HasSuffix(strReciv, "n")

    if s1 && s2 && s3 {

        fmt.Println("Found!")
    } else {
        fmt.Println("Not Found")
    }

}

【讨论】:

    【解决方案2】:

    经过大量调查,终于奏效了:)

    我也需要删除\r

    package main
    
    import (
        "bufio"
        "fmt"
        "os"
        "strings"
    )
    
    func main() {
    
        str := bufio.NewReader(os.Stdin)
    
        fmt.Println("Please enter a string:")
    
        strIn, _ := str.ReadString('\n')
        strReciv := strings.Replace(strIn, "\r\n", "", -1)
    
        //---------------------------------------------
    
        s1 := strings.HasPrefix(strReciv, "i")
        s2 := strings.Contains(strReciv, "a")
        s3 := strings.HasSuffix(strReciv, "n")
    
        if s1 && s2 && s3 {
    
            fmt.Println("Found!")
        } else {
            fmt.Println("Not Found")
        }
    
    }
    

    回车 术语 CRLF 指的是回车(ASCII 13,\r)换行(ASCII 10,\n)。它们用于记录行的终止,但在当今流行的操作系统中以不同的方式处理。

    【讨论】:

    • 为了让这更与平台无关 - 看看 bufio.Scanner 是如何做到的 here。它基本上是对\r 的查找和替换(如果存在)。 \n 是分隔符
    • 嗯,没错。 @filpe,在做问题时总是提到它是 microsoft windows 那里有很多怪癖
    猜你喜欢
    • 2014-06-29
    • 1970-01-01
    • 2011-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-24
    相关资源
    最近更新 更多