php-Editor Yuezi ersetzt wiederholte Teilzeichenfolgen in einer Zeichenfolge. Es ist ein häufiges Problem, nur eine davon zu ersetzen. Bei der String-Verarbeitung müssen wir manchmal wiederholte Teilstrings in einem String ersetzen, aber wir möchten nicht alle wiederholten Teilstrings ersetzen, sondern nur einen davon. Dadurch können andere identische Teilzeichenfolgen beibehalten und gleichzeitig der gewünschte Ersetzungseffekt erzielt werden. In PHP können wir diese Anforderung mithilfe einiger integrierter Funktionen und regulärer Ausdrücke erreichen. Im Folgenden stellen wir detailliert vor, wie die Methode zum Ersetzen nur einer der wiederholten Teilzeichenfolgen in der Zeichenfolge implementiert wird.
Ich mache ein einfaches Henkerspiel mit go, aber ich stoße auf einen Fehler, bei dem die Zeichenfolge „unknown_string“ (die im Code angezeigt wird) das Zeichen _ hat, sodass andere Spieler die Buchstaben erraten können Sehen Sie sich die Länge des Wortes an. Immer wenn der Spieler den richtigen Buchstaben eingibt, möchte ich, dass er das n-te (n hängt vom Index ab, in dem der Buchstabe im Wort gefunden wird) _ Zeichen durch diesen Buchstaben ersetzt. Dies war erfolgreich, aber da ist ein Problem. Wenn ein Wort zwei wiederholte Buchstaben hat, wird nur einer davon ersetzt.
Ich habe eine separate Funktion namens iterate erstellt (diese Funktion wurde erstellt, weil ich verschachtelten Code vermeiden wollte), um über alle Indizes zu iterieren. Aber es funktioniert nicht, der Code lautet wie folgt:
package main import ( "fmt" "strings" ) var input string var word string var unknown_word []string var unknown_word_string string var index int var guesses int var change_unknown_word_string []byte func main() { fmt.Println("Welcome to hangman") fmt.Println("Player 1, choose a word!") fmt.Scan(&word) for i := 1; i <= len(word); i++ { unknown_word = append(unknown_word, "_") } unknown_word_string = strings.Join(unknown_word, "") for { fmt.Println("Player 2, guess a letter or a word") fmt.Println(unknown_word_string) fmt.Scan(&input) if guesses == 6 { fmt.Println("Player 2 lost! Player 1's word was: ", word) break } else if unknown_word_string == input { fmt.Println("Player 1 lost! Player 2 guessed the word by guessing the letter!") } if strings.Contains(word, input) && word != input { index = strings.Index(word, input) iterate() fmt.Println("You guessed a letter!") } else if word == input { fmt.Println("Player 1 lost! Player 2 guessed the word by guessing the whole word!") break } else { fmt.Println("Nothing found") guesses++ } } } func iterate() { change_unknown_word_string = []byte(unknown_word_string) for i := 0; i < len(change_unknown_word_string); i++ { if change_unknown_word_string[i] == change_unknown_word_string[index] { change_unknown_word_string[i] = []byte(input)[0] } } unknown_word_string = string(change_unknown_word_string) }
Vergleich if change_unknown_word_string[i] == change_unknown_word_string[index]
没有任何意义,因为 unknown_word_string
显然在这些位置包含 _
.
Sie sollten word[i] == input[0]
in einer Schleife vergleichen.
Beachten Sie jedoch, dass Sie string
转换为 byte
数组不支持 unicode。最好使用 rune
s (Unicode-Codepunkte) hinzufügen, damit Sie nicht mehr auf lateinische1-Zeichen beschränkt sind.
func iterate() { needle := []rune(input)[0] haystack := []rune(word) buf := []rune(unknown_word_string) for i := range haystack { if haystack[i] == needle { buf[i] = needle } } unknown_word_string = string(buf) }
P.S. Dieser Vergleich ist falsch
if unknown_word_string == input { fmt.Println("Player 1 lost! Player 2 guessed the word by guessing the letter!") }
Es sollte ifunknown_word_string == word
并位于调用 iterate()
danach sein.
Das obige ist der detaillierte Inhalt vonErsetzen Sie wiederholte Teilzeichenfolgen in einer Zeichenfolge, indem Sie nur eine davon ersetzen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!